Мне интересно, как я должен хранить / ссылаться на мои контейнеры для инъекций зависимостей. Можно ли, чтобы контейнер был статическим свойством в статическом классе? Или я должен сделать контейнер переменной экземпляра в приложении? Мне интересно, каковы плюсы и минусы каждого варианта, и что лучше всего подходит для этого в приложениях для Интернета, mvc, консоли и Windows?
Где мне хранить ссылку на мой контейнер DI?
Ответы (2)
Я рекомендую сохранить его как переменную экземпляра в приложении. Использование статического свойства - что делает его глобально доступным синглтоном - скрывает зависимость вашего приложения от него, что является одной из вещей, от которых вы пытаетесь избавиться, в первую очередь используя контейнер для внедрения зависимостей!
Сказав это, если ваша структура затрудняет вам доступ к экземпляру приложения, использование статической переменной не будет концом света.
Я согласен с мистером Стернаном в этом. Следует учитывать, что некоторые контейнеры DI реализуют IDisposable, поэтому вы, вероятно, захотите избавиться от контейнера при нормальном завершении программы. См. Как согласовать IDisposable и IoC?
Также обратите внимание, что часто лучше избегать разброса зависимостей от контейнера DI по всему приложению. Другими словами, старайтесь не делать контейнер глобально доступным (синглтон, статическое свойство или даже внедренный) для использования в качестве Поиск услуг.
Вместо этого вы можете использовать способность контейнера разрешать зависимости зависимостей. Например, вы можете создать контейнер при запуске приложения и использовать его для построения своей модели (в MVC). Модель может зависеть от репозитория и веб-службы. Репозиторий может зависеть от регистратора. Контейнер разрешит все эти проблемы при построении модели. Если ваша модель должна создавать экземпляры зависимостей на лету, внедрите в нее фабрику.