События, настроенные в соответствии с соглашением, не приводят к подписке
Мое приложение пытается получить события от конечной точки.
Если я подписываюсь<>() в явном виде, я вижу входящую подписку в конечной точке публикации. Если я пытаюсь получить тот же результат, настраивая соглашение, это терпит неудачу.
Что мне не хватает?
Моя конфигурация выглядит так:
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);
}
Самая важная документация и пример кода, кажется, не упоминают ничего другого, что я должен сделать https://docs.particular.net/nservicebus/messaging/conventions?version=core_5
2 ответа
Нашел это. AssemblyQualifiedName - это имя типа с префиксом сборки. Что мне было нужно, так это название самой сборки. Так
busConfiguration.AssembliesToScan(AllAssemblies
.Matching("NServiceBus")
.And("ServiceControl")
.And(pingHandlerType.AssemblyQualifiedName)
.And(pingEventType.AssemblyQualifiedName));
Должно было
busConfiguration.AssembliesToScan(AllAssemblies
.Matching("NServiceBus")
.And("ServiceControl")
.And(pingHandlerType.Assembly.GetName().Name)
.And(pingEventType.Assembly.GetName().Name));
Несколько часов меня отталкивало то, что type.Assmembly.FullName - это имя сборки со всей информацией о ее версии и т. Д. Это тоже не работает.
У вас есть обработчик для IMyEvent
? Автоматическая подписка работает, только если существует обработчик для данного события в отсканированной сборке.