Инъекция зависимости: Как обойти инъекционный контейнер? - PullRequest
7 голосов
/ 29 марта 2010

(Этот вопрос не зависит от конкретной платформы IoC, поэтому интерфейсы и типы в моих примерах являются мета-типами. Просто замените их соответствующими типами для вашей любимой платформы IoC в вашей голове.)

В моих основных методах я обычно настраиваю свой контейнер следующим образом:

static void Main()
{
    IInjector in = new Injector();
    in.Register<ISomeType>().For<SomeType>();
    in.Register<IOtherType().For<OtherType>();
    ...

    // Run actual application
    App app = in.Resolve<App>();
    app.Run();
}

Мой вопрос: как вы отправляете Инжектор? Я обычно только что регистрировал инжектор с собой и вводил его в типы, которые сами будут делать инъекцию, но я не уверен, является ли это правильным «шаблоном».

Ответы [ 2 ]

15 голосов
/ 29 марта 2010

Вы не должны передавать контейнер.

Вместо этого ваш метод точки входа / main запрашивает у контейнера объекты, которые ему необходимы для запуска - например, объект / бин приложения. Затем контейнер возвращает полный граф объектов, связанный с App, что позволяет запускать app.Run() со всеми удовлетворенными зависимостями.

Это немного против паттерна для объектов, которые должны знать о контейнере, или для каждого объекта, запрашивающего у контейнера его зависимости - если вы сделаете это, то у вас будет не инвертированный и то, что у вас есть, - это не внедрение зависимостей - у вас все еще есть объекты, спрашивающие о том, что им нужно, вместо того, чтобы получать то, что им нужно.

2 голосов
/ 29 марта 2010

Лучше избегать инъекций инжектора. Просто создайте нужные вам типы, а затем начните выполнение. Я написал более длинный пост на эту тему: Доступ к контейнеру DI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...