2011-08-16 162 views
3

构建我们已经打了一个问题,我们想注入的依赖到已通过反射构造一个对象:Ninject注入对象通过反射

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

注射似乎并没有使用在这里发生的事情财产注入。这不可能吗?我们如何解决这个问题? 谢谢。

回答

1

通过IKernel上的kernel.Inject(Object)方法进行反射构建后,可以在对象上进行属性注入。但是这将是后期建设,你不会得到任何构造注入。

+0

这似乎是迄今为止最好的方式。但是,我如何到达我的内核?创建一个新的?它在Web服务应用程序级别实例化(我们使用WCF扩展)。与绑定一起。我们的实例化逻辑在业务逻辑级别(不同的程序集)执行,它不知道它被Web服务使用。 – KirEvse

+0

依赖注入模式是“经典抽象类工厂”+新特性(基于ctor/properties,对象生命周期...的接线依赖性)的泛化。因此它应该像抽象类工厂一样使用:在安装应用程序(例如:* main * function)中,您应该定义“类工厂”并将其作为抽象传递给组件(例如:业务逻辑组件)。在我们的例子中,抽象类工厂是IKernel。如何将内核传递给你的程序集?将每个呼叫的实例传递给需要的业务。或者在您的业务逻辑程序集中为其定义一个单例。 –

+0

你将不得不找出一些方法来获取内核。看看这个问题的遗留系统的一些想法http://stackoverflow.com/q/6562872/154477 – ryber

0

要使用依赖注入框架,您不应该使用new或reflection来自己实例化对象,而应该调用注入框架。 你的情况:

//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 

任何方式依赖注入框架用于避免使用用于对象实例化+布线反射它的依存关系,基于先前的配置(使用Ninject 绑定呼叫)。

+0

不幸的是,大约有100多个类实现了这个接口。这些类的名称是动态检索的,结果也是动态实例化的(参见上面的示例)。哪些类需要实例化是依赖于业务逻辑的,并且将很难重构。 – KirEvse

0

有一个Kernel.Get(Type),但是因为你想调用一个特定的构造函数,所以没用。有一个可定制的构造函数选择策略,您可以使用它来模拟您在第二行中执行的操作。