Инъекция без инъекций в объект, построенный с помощью отражения - PullRequest
3 голосов
/ 17 августа 2011

Мы столкнулись с проблемой, из-за которой мы хотели бы внедрить зависимость в объект, который был создан с помощью отражения:

        Type _type = Type.GetType(className, true, true);
        ConstructorInfo _ctor = _type.GetConstructor(new[] { typeof(MyClass) });
        IReg _reg = (IReg)_ctor.Invoke(new object[] { _myClass });

Похоже, что внедрение здесь не происходит при использовании свойства.Разве это не возможно?Как мы можем обойти эту проблему?Спасибо.

Ответы [ 3 ]

1 голос
/ 17 августа 2011

Вы можете добавить свойство на объект после его построения с помощью отражения с помощью метода kernel.Inject(Object) в IKernel.Но это будет постстроение, и вы не получите никакой инъекции конструктора.

0 голосов
/ 17 августа 2011

Существует Kernel.Get(Type), но, поскольку вы хотите вызвать определенный конструктор, это бесполезно. Существует настраиваемая стратегия выбора конструктора, которую можно использовать для эмуляции того, что вы делаете во второй строке.

0 голосов
/ 17 августа 2011

Чтобы использовать инфраструктуру внедрения зависимостей, вы не должны создавать экземпляр объекта самостоятельно, используя new или отражение, вы должны вызывать инфраструктуру внедрения. В вашем случае:

//setup the application
IKernel kernel = new StandardKernel();
//add all your other bindings for property injection
...

kernel.Bind<MyClass>.ToConstant(_myClass); //if same _myClass instance is used than this can go in setup application. 
Type _type = Type.GetType(className, true, true);
var _reg = kernel.Get(_type);
kernel.Unbind<MyClass>(); //cleanup the global kernel

Любой способ, которым используется структура внедрения зависимостей, чтобы избежать использования отражения для создания экземпляра объекта + разводки его зависимостей на основе предыдущей конфигурации (с использованием Bind вызовов для Ninject).

...