Как ninject работает на высоком уровне, как он перехватывает создание экземпляра объекта?

#asp.net #dependency-injection #structuremap #ninject

#asp.net #внедрение зависимости #structuremap #ninject

Вопрос:

Как работают эти фреймворки dep. injection на высоком уровне?

Я могу понять, если вы всегда создаете экземпляр объекта через пользовательскую фабрику, например:

 IUser user = DepInjector.Get<User>();
  

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

Существуют ли dep. inj. frameworks, которые работали бы как:

 IUser user = new User();
  

Если да, то как он получит нужного пользователя, где он подключается к CLR для этого? В случае asp.net веб-сайт, это как-то отличается?

Ответ №1:

Если вы хотите знать, как работает Ninject, то очевидным местом для начала было бы прочитать, как работает внедрение на их официальной вики. Он использует отражение, но теперь также использует динамические методы:

«По умолчанию стандартное ядро будет создавать динамические методы (через System.Reflection.Emit.DynamicMethod), который может использоваться для ввода значений в различные цели внедрения. Затем эти динамические методы запускаются с помощью вызовов делегатов.»

Что касается вашего второго примера, я не верю, что существуют какие-либо фреймворки DI, которые выполняли бы то, что вы просите. Однако внедрение конструктора, как правило, является наиболее распространенным способом реализации IoC, так что при создании класса он знает, к какому типу привязываться с помощью некоторой привязки конфигурации. Итак, в вашем примере IUser было бы сопоставлено с concrete User в конфигурационных привязках, так что любой класс-потребитель, у которого есть IUser параметр как часть его конструктора, получит правильный User тип, переданный.

Комментарии:

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

Ответ №2:

AFAIK, нет способа «подключиться» к созданию экземпляра объекта с помощью CLR. Единственный способ использовать DI во втором случае — использовать программу перезаписи сборки (т. Е. постпроцессор, аналогичный PostSharp), чтобы заменить вызов new на вызов фабричного метода DI (т.Е. GetUser ) в скомпилированном коде.