Внедрение зависимости: Как раздать инжекционный контейнер?

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

В моих основных методах я обычно настроил свой контейнер, делающий что-то вроде этого:

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();
}

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

7
задан Alex 29 March 2010 в 17:21
поделиться

2 ответа

Не передавайте контейнер.

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

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

14
ответ дан 6 December 2019 в 12:48
поделиться

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

2
ответ дан 6 December 2019 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: