Как 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 который возвращается при запуске автобуса. Я думаю, что они предлагают отправлять сообщения только от обработчиков сообщений, используя контекст, но иногда это просто не работает.

Другие вопросы по тегам