Как Nservicebus обрабатывает вложенные контейнеры на карте структуры?
TL;DR; некоторое свойство не вводится в сервис, когда это необходимо. Как Nservicebus обрабатывает вложенные контейнеры на карте структуры?
Эй, ребята, новенькие здесь. В настоящее время я обновляю наш проект до NSB6. У меня есть пара вопросов о внедрении зависимостей с Structuremap.
У нас есть некоторые сервисы, которые используют ISendOnlyBus, который мы вызываем из обработчика. В целях тестирования (я просто хочу, чтобы обработчик работал), я изменил их на IMessageHandlerContext, и в начале обработчика я вставляю контекст в контейнер. Он работает, как и ожидалось, IMessageHandlerContext разрешен в этих службах, и я могу использовать его.
public class MyMessageHandler : IHandleMessage<IMyMessage>
{
private IContainer _container;
private ISomeService _someService;
public MyMessageHandler (IContainer container, ISomeService someService)
{
_container = container;
_someService = someService;
}
public async Task Handle(IMyMessage message, IMessageHandlerContext context)
{
_container.Inject(typeof(IMessageHandlerContext), context);
_someService.DoSomething();
}
}
public class SomeService : ISomeService
{
private IMessageHandlerContext _context;
public SomeService(IMessageHandlerContext context)
{
_context = context;
}
public void DoSomething()
{
_context.Send<ISomeMessage>(x => {
//... init message
});
}
}
Теперь проблема в том, что у нас есть собственный IPostUpdateEventListener Nhibernate над сущностью, которая отправляет сообщения nservicebus. В версии 5 он имел ISendOnlyEndpoint, который он использовал для отправки, так же, как и другие сервисы, но на этот раз контекст не разрешается Structuremap. Мне интересно, как и если nservicebus управляет вложенными контейнерами внутри обработчиков сообщений. Я не могу найти какую-либо документацию для этого.
2 ответа
Дочерние контейнеры в StructureMap не поддерживают некоторые функции, необходимые для контейнеров NServiceBus. Политики используются для настройки внедрения, а политики не поддерживаются в дочерних контейнерах.
Политики применяются только к корневому контейнеру в StructureMap
Вот проблема в репозитории NServiceBus.StructureMap, чтобы отследить это.
Я предполагаю, что предложенный рефакторинг этого будет
public class MyMessageHandler : IHandleMessage<IMyMessage>
{
public async Task Handle(IMyMessage message, IMessageHandlerContext context)
{
context.Resolve<ISomeService>().DoSomething(context);
}
}
public class SomeService : ISomeService
{
public void DoSomething(IMessageHandlerContext context)
{
context.Send<ISomeMessage>(x => {
//... init message
});
}
}
context.Resolve
будет расширением, которое вы пишете для доступа к экземпляру контейнера в экземпляре контекста.
Однако, если вы хотите просто отправлять сообщения извне обработчика сообщений, вы можете ввести IEndpointInstance
или же IMessageSession
который возвращается при запуске автобуса. Я думаю, что они предлагают отправлять сообщения только от обработчиков сообщений, используя контекст, но иногда это просто не работает.