Где я должен хранить ссылку на мой контейнер DI? - PullRequest
9 голосов
/ 17 ноября 2009

Мне интересно, как мне хранить / ссылаться на контейнеры для инъекций зависимостей. Можно ли, чтобы контейнер был статическим свойством статического класса? Или я должен иметь контейнер быть переменной экземпляра в приложении? Мне интересно, каковы плюсы и минусы каждого варианта, и каков наилучший способ для этого в веб, mvc, console и windows-приложениях?

Ответы [ 2 ]

5 голосов
/ 17 ноября 2009

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

Сказав, что если ваша инфраструктура затруднит вам доступ к экземпляру приложения, использование статической переменной не станет концом света.

1 голос
/ 17 ноября 2009

Я согласен с мистером Стерном в этом. Следует учитывать, что некоторые DI-контейнеры реализуют IDisposable, поэтому вы, вероятно, захотите утилизировать контейнер при обычном завершении программы. См. Как согласовать IDisposable и IoC?

Также обратите внимание, что часто лучше избегать разбрасывания зависимостей от контейнера DI во всем приложении. Другими словами, старайтесь не делать контейнер глобально доступным (синглтон, статическое свойство или даже внедренный) для использования в качестве Service Locator .

Вместо этого вы можете использовать способность контейнера разрешать зависимости зависимостей. Например, вы можете создать контейнер при запуске приложения и использовать его для построения вашей модели (в MVC). Модель может зависеть от хранилища и веб-службы. Хранилище может зависеть от регистратора. Контейнер разрешит все это, когда модель будет построена. Если вашей модели нужно создавать экземпляры зависимостей на лету, добавьте в нее фабрику.

...