2015-10-16 1 views
1

Je n'ai pas trouvé de solution pour consommer une autre interface puis publiée.Bus de service Rebus. Comment mapper différents types/interfaces

Dans un cas simple, si je veux publier IMessage et consommer IMessage, je dois partager l'assemblage avec la définition IMessage entre deux applications.

Mais que se passe-t-il si ces deux applications sont développées par différentes entreprises.

Dans ce cas, j'ai deux options:

  1. font un accord sur les interfaces communes, les conventions de nommage, etc et partager une bibliothèque commune

  2. laisser les deux entreprises y font l'emploi car ils sont utilisés pour faire et à l'intérieur du bus de service (ou du serveur d'applications) mapper les types de données.

La deuxième option est plus appropriée pour moi, mais je n'ai pas trouvé de solution.

Par exemple, je pourrais avoir un employé dans un système comme

public interface IEmployee 
{ 
    int ID { get; set; } 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

Et dans un autre système

public interface ILightEmployee 
{ 
    int id { get; set; } 
    string full_name { get; set; } 
} 

Je veux publier iEmployee et consommer ILightEmployee.

Au cours de sérialisation/phase désérialisation en bus de service que je veux utiliser une cartographie des propriétés et quelque chose archives comme celui-ci (il est plus comme un code pseudo):

public class ContractMapper 
{ 
    public LightEmployee Map(IEmployee employee) 
    { 
     return new LightEmployee() 
     { 
      id = employee.ID, 
      full_name = employee.LastName + " " + employee.FirstName 
     }; 
    } 
} 

Par exemple MuleESB fournit un éditeur pour ces transformations/cartographie. LINK

C'est une solution avancée inutile pour moi, mais au moins dans le code je veux faire la même chose. Est-il possible d'utiliser le bus de service Rebus?

Répondre

0

Tant que Rebus est capable de désérialiser correctement l'objet JSON entrant dans une classe concrète, il tentera d'envoyer le message à tous les gestionnaires polymorphiquement compatibles.

Avec la valeur par défaut Newtonsoft JSON.NET et le Jil-based JSON serializer, l'en-tête rbs2-content-type sera réglé sur application/json;charset=utf-8, et aussi longtemps que l'en-tête de message entrant commence par application/json et a un encodage compatible, les deux serializers essayera de désérialiser au type spécifié par l'en-tête rbs2-msg-type.

Donc, si vous avez une classe concrète correspondant disponible dans le domaine de l'application, vous pouvez avoir un gestionnaire qui implémente IHandleMessages<IEmployee> ou IHandleMessages<ILightEmployee> - ou IHandleMessages<object> pour cette question, parce que ce gestionnaire est polymorphically compatible avec tous les messages entrants.

Le sérialiseur Jil est spécial cependant, en ce sens qu'il se désérialisera en dynamic s'il ne trouve pas le type .NET dans lequel il était supposé désérialiser.

Cela signifie que ce gestionnaire:

public class HandlesEverything : IHandleMessages<object> 
{ 
    public async Task Handle(dynamic message) 
    { 
     // .... woohoo! 
    } 
} 

couplé avec le sérialiseur Jil sera capable de gérer tous les messages, de façon dynamique, la cueillette des selon morceaux, il est intéressé par

J'espère que la réponse donne. une impression de certaines des possibilités avec Rebus. Dites-m'en plus s'il y a un scénario qui, d'après vous, n'est pas bien couvert.

+0

Merci pour votre réponse. Je suis nouveau avec Rebus, donc jusqu'à maintenant ce n'est pas clair pour moi, mais les bonnes nouvelles sont qu'il semble que le Rebus puisse gérer ce problème. Je dois passer plus de temps à jouer avec pour trouver la solution exacte. – dannikoti