Начальная область, передавая IContainer (AutoFac) - PullRequest
0 голосов
/ 28 марта 2019

Использование MediatR из обработчика сообщений (Rebus).Обработчик сообщений - это место, где контекст живет и умирает после обработки сообщения.Думая о следующем:

public class MessageHandler: IHandleMessages<Thing> {
  public MessageHandler(
    IContainer container
    // other dependencies
  ) { 
    Container = container;
    ... 
  }

  protected IContainer Container { get; }

  public async Task Handle(Thing message)
  {
      using(var scope = Container.BeginLifetimeScope())
      {
        var mediator = scope.Resolve<IMediator>();
        mediator.Send(new SuperCommand { .... super paramters });
      }
  } 
}

Вопрос в том, является ли обход IContainer анти-паттерном?MediatR с AutoFac обычно настроен для разрешения запроса |обработчики команд через IComponentContext, так что, когда IMediator расположен, обработчики расположены.

1 Ответ

0 голосов
/ 28 марта 2019

Вопрос в том, является ли обход IContainer анти-паттерном?

Это зависит от его использования. Внедрение зависимостей PP & P описывает (в §5.2 ), что поставка компонентов приложения за пределы Composition Root с доступом к неограниченному набору изменчивых зависимостей является анти-паттерном, называемым Сервисный локатор .

В вашем случае интерфейс IContainer позволяет получить доступ к неограниченному набору зависимостей. Это связано с тем, что метод Resolve<T> позволяет разрешать любые типы. Это делает интерфейс IContainer кандидатом на то, чтобы стать сервис-локатором. Однако используется ли в качестве локатора службы, зависит от того, как он используется.

В книге очень точно определен локатор службы как шаблон, примененный «вне корня композиции», поскольку ссылка на контейнер или любую такую ​​абстракцию в корне композиции не вызывает таких же недостатков.

Другими словами, вы можете ввести IContainer в свой класс, например, MessageHandler, если эта реализация определена внутри корня композиции приложения. Это сделало бы MessageHandler инфраструктурным компонентом.

...