Reflection 通过反射构造的对象的Ninject注入

Reflection 通过反射构造的对象的Ninject注入,reflection,ninject,Reflection,Ninject,我们遇到了一个问题,我们希望将依赖项注入到通过反射构造的对象中: Type _type = Type.GetType(className, true, true); ConstructorInfo _ctor = _type.GetConstructor(new[] { typeof(MyClass) }); IReg _reg = (IReg)_ctor.Invoke(new object[] { _myClass }); 使用属性注入,这里似

我们遇到了一个问题,我们希望将依赖项注入到通过反射构造的对象中:

        Type _type = Type.GetType(className, true, true);
        ConstructorInfo _ctor = _type.GetConstructor(new[] { typeof(MyClass) });
        IReg _reg = (IReg)_ctor.Invoke(new object[] { _myClass });
使用属性注入,这里似乎没有发生注入。不可能吗?我们怎样才能避开这个问题?
谢谢。

要使用依赖注入框架,您不应该使用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
//设置应用程序
IKernel kernel=新的标准内核();
//为属性注入添加所有其他绑定
...
kernel.Bind.ToConstant(_myClass)//如果使用相同的_myClass实例,则可以将其放入安装应用程序中。
Type _Type=Type.GetType(className,true,true);
var _reg=kernel.Get(_type);
Unbind()//清理全局内核

依赖项注入框架用于避免基于以前的配置(使用Ninject的绑定调用)对对象实例化使用反射+连接其依赖项的任何方式。

您可以在对象构建后,通过使用IKernel上的反射
kernel.inject(object)
方法对对象进行属性注入。但是这将是后期构造,您将不会得到任何构造函数注入。

有一个
内核.get(Type)
,但是当您想要调用特定的构造函数时,它是没有用的。有一个可定制的构造函数选择策略,您可以使用它来模拟第二行中的操作。

不幸的是,大约有100多个类实现了该接口。这些类的名称是动态检索的,结果也是动态实例化的(参见上面的示例)。哪些类需要实例化取决于业务逻辑,并且很难重构。这似乎是目前为止最好的方法。但是我如何到达我的内核呢?创建一个新的?它是在web服务应用程序级别实例化的(我们使用的是WCF扩展)。以及绑定。我们的实例化逻辑在业务逻辑级别(不同的程序集)执行,而web服务不知道它在使用。依赖项注入模式是“经典抽象类工厂”和新特性(基于ctor/属性、对象生命周期等的连接依赖项)的推广。所以它应该像抽象类工厂一样使用:在安装应用程序(例如:main函数)中,您应该定义“类工厂”,并将其作为抽象传递给组件(例如:您的业务逻辑程序集)。在我们的例子中,抽象类工厂是IKernel。如何将内核传递到程序集?为每个需要的业务调用传递一个实例。或者在您的业务逻辑程序集中为它定义一个单例。您必须找到某种方法来获取内核。查看此问题,了解有关遗留系统的一些想法