2017-08-09 2 views
1

J'ai un projet de configuration rébus qui est partagé pour de nombreux projets api webQ: Comment prolonger la configuration de routage dans Rebus

Donc, fondamentalement, il semble que

Web api 1 ==>Shared Rebus Config

Web api 2 ==>Shared Rebus Config

Web api 3 ==>Shared Rebus Config

Ma question est, si j'ai quelques messages & gestionnaires dans le Web api 3 projet, comment puis-je configurer le routage pour eux?


Ma config actuelle:

var autofacContainerAdapter = new AutofacContainerAdapter(container); 

return Configure 
    .With(autofacContainerAdapter) 
    .Serialization(s => s.UseNewtonsoftJson()) 
    .Routing(r => 
    { 
     r.TypeBased() 
      .MapAssemblyOf<ProjectA.MessageA>(EnvironmentVariables.ServiceBusQueueName) 
      .MapAssemblyOf<ProjectB.MessageB>(EnvironmentVariables.ServiceBusQueueName); 
    }) 
    .Sagas(s => 
    { 
     s.StoreInSqlServer(EnvironmentVariables.ConnectionString, "Saga", "SagaIndex"); 
    }) 
    .Options(o => 
    { 
     o.LogPipeline(); 
     o.EnableDataBus().StoreInBlobStorage(EnvironmentVariables.AzureStorageConnectionString, EnvironmentVariables.BlobStorageContainerName); 
     o.EnableSagaAuditing().StoreInSqlServer(EnvironmentVariables.ConnectionString, "Snapshots"); 
    }) 
    .Logging(l => 
    { 
     l.Use(new SentryLogFactory()); 
    }) 
    .Transport(t => 
    { 
     t.UseAzureServiceBus(EnvironmentVariables.AzureServiceBusConnectionString, EnvironmentVariables.ServiceBusQueueName).AutomaticallyRenewPeekLock(); 
    }) 
    .Start(); 
+0

Qu'est-ce qui vous empêche de configurer le routage de votre troisième API Web de la même manière que vous l'avez fait pour les deux premiers? – mookid8000

+0

@ mookid8000 J'ai quelques messages et gestionnaires qui ne sont disponibles que pour la troisième api web –

Répondre

1

Eh bien ... que vous avez probablement déjà découvert, il est impossible de faire des appels supplémentaires à la partie .Routing(r => r.TypeBased()....). Par conséquent, je peux voir deux manières assez faciles vers l'avant:

1: Passez simplement les paramètres supplémentaires à votre méthode de configuration partagée de l'extérieur, par ex. quelque chose comme ceci:

var additionalEndpointMappings = new Dictionary<Assembly, string> 
{ 
    { typeof(Whatever).Assembly, "another-queue" } 
}; 
var bus = CreateBus("my-queue", additionalEndpointMappings); 

qui bien sûr doit ensuite être traités de façon appropriée dans le rappel de configuration .Routing(...).

2: Tirez toutes les configurations communes dans une nouvelle méthode d'extension. J'utilise presque toujours cette méthode moi-même, parce que je l'ai trouvé facile à maintenir.

D'abord, vous créez une nouvelle méthode d'extension RebusConfigurer dans un endroit lib commun:

// shared lib 

public static class CustomRebusConfigEx 
{ 
    public static RebusConfigurer AsServer(this RebusConfigurer configurer, string inputQueueName) 
    { 
     return configurer 
      .Logging(...) 
      .Transport(...)) 
      .Sagas(...) 
      .Serialization(...) 
      .Options(...); 
    }  
} 

et vous pouvez appeler cela en allant

Configure.With(...) 
    .AsServer("my-queue") 
    .Start(); 

dans vos critères d'évaluation.

3: Une combinaison de (1) et (2) qui permet à ceci:

Configure.With(...) 
    .AsServer("my-queue") 
    .StandardRouting(r => r.MapAssemblyOf<MessageType>("somewhere-else")) 
    .Start(); 

qui peut finir par éviter le code répétitif, tout en conservant une grande flexibilité, et en regardant en fait :) assez propre

+0

merci beaucoup, je vais essayer les deux méthodes et revenir à vous –

+0

pouvez-vous s'il vous plaît fournir un exemple de 1), je ne peux pas utiliser l'assemblage dans 'MapAssemblyOf ()' car il nécessite le type ** générique ** –