(Этот вопрос не полагается на определенную платформу МОК, таким образом, интерфейсы и типы в моих образцах являются метатипами. Просто замените их соответствующими типами для Вашей любимой платформы МОК в Вашей голове.)
В моих основных методах я обычно настроил свой контейнер, делающий что-то вроде этого:
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();
}
Мой вопрос, как Вы отправляли Инжектор вокруг? Я обычно только что регистрировал инжектор в себе и вводил его в типы, которые сами собираются сделать инжекцию, но я не уверен, является ли это надлежащим "шаблоном".
Не передавайте контейнер.
Вместо этого ваша точка входа / основной метод запрашивает у контейнера объекты, необходимые для начала работы, например, ваш объект / компонент App. Затем контейнер возвращает полный граф объектов, подключенный к App
, что позволяет запускать app.Run ()
со всеми зависимостями.
Это своего рода анти-шаблон для объектов, которые знают о контейнере, или для каждого объекта, который запрашивает у контейнера свои зависимости - если вы это сделаете, то у вас будет не инвертированный элемент управления. и то, что у вас есть, не является инъекцией зависимостей - у вас все еще есть объекты, которые запрашивают то, что им нужно, вместо того, чтобы получать то, что им нужно.
Лучше избегать закачки в инжектор. Просто создайте нужные вам типы и приступайте к выполнению. Я написал несколько более длинный пост по этой теме: Доступ к контейнеру DI