2017-05-18 3 views
2

Mon application tente de recevoir des événements d'un noeud final.
Si je m'abonne <>(), je vois explicitement un abonnement arriver sur le point de terminaison de publication. Si j'essaie d'obtenir le même résultat en configurant une convention, cela échoue.Les événements configurés par convention n'aboutissent pas à un abonnement

Qu'est-ce qui me manque?

Ma configuration ressemble à ceci:

public Subscriber(int maxConcurrency) 
{ 
    var pingEventType = typeof(IMyEvent); 
    var pingHandlerType = typeof(MyEventHandler); 

    var busConfiguration = new BusConfiguration(); 
    busConfiguration.EndpointName("MyEndpointName"); 
    busConfiguration.UseSerialization<JsonSerializer>(); 
    busConfiguration.EnableInstallers(); 
    busConfiguration.UsePersistence<NHibernatePersistence>(); 
    busConfiguration 
     .UseTransport<SqlServerTransport>() 
     .CallbackReceiverMaxConcurrency(maxConcurrency); 
    busConfiguration.AssembliesToScan(AllAssemblies 
     .Matching("NServiceBus") 
     .And("ServiceControl") 
     .And(pingHandlerType.AssemblyQualifiedName) 
     .And(pingEventType.AssemblyQualifiedName)); 
    busConfiguration 
     .Conventions() 
     .DefiningEventsAs(x => x.Namespace != null && x.Namespace == pingEventType.Namespace); 

    var container = new ContainerBuilder().Build(); 
    busConfiguration.UseContainer<AutofacBuilder>(customizations => 
    { 
     customizations.ExistingLifetimeScope(container); 
    }); 
    _startableBus = Bus.Create(busConfiguration); 

    // Uncommenting below line results in subscription on the publishing endpoint 
    //_startableBus.Subscribe(pingEventType); 
} 

La documentation la plus pertinente et des exemples de code ne semble pas mentionner tout ce que je devrais faire https://docs.particular.net/nservicebus/messaging/conventions?version=core_5

+1

Je suppose que vous devrez inclure les assemblys de messages dans l'analyse d'assemblage? –

+0

Je pensais que j'étais avec la ligne '.And (pingEventType.AssemblyQualifiedName));' mais je l'ai fait mal. Mettez-le dans une réponse pour le futur moi et les autres –

Répondre

4

Je l'ai trouvé. AssemblyQualifiedName est le nom du type préfixé par l'assembly. Ce dont j'avais besoin, c'était le nom de l'assemblée elle-même. Alors

busConfiguration.AssembliesToScan(AllAssemblies 
    .Matching("NServiceBus") 
    .And("ServiceControl") 
    .And(pingHandlerType.AssemblyQualifiedName) 
    .And(pingEventType.AssemblyQualifiedName)); 

Aurait été

busConfiguration.AssembliesToScan(AllAssemblies 
    .Matching("NServiceBus") 
    .And("ServiceControl") 
    .And(pingHandlerType.Assembly.GetName().Name) 
    .And(pingEventType.Assembly.GetName().Name)); 

Ce qui m'a jeté pendant des heures était que type.Assmembly.FullName est le nom de l'assemblée avec toutes ses informations de version etc ci-joint. Cela ne marche pas non plus.