繁体   English   中英

Assembly.CreateInstance解决IoC容器

[英]Assembly.CreateInstance to resolve IoC Container

我正在尝试使用以下代码创建类的实例(在运行时通过字符串):

Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName); //throws MissingMethodException
Type classType = instance.GetType();

但是,我要实例化的类在构造函数中有两个参数,这些参数由Unity IoC容器解析。

当我执行上面的代码时,它将引发“ System.MissingMethodException”。

我在网上搜索,看来Assembly.CreateInstance无法解决Unity依赖项注入。

这是死路一条,还是有一种方法可以使用“ CreateInstance”方法实例化类并解决Unity依赖关系?

CreateInstance可以接收参数,可以使用ctor参数以这种方式调用它:

(T)Activator.CreateInstance(typeof(T), param1, param2);

Activator.CreateInstance不知道您的应用程序中有IOC模块。 它只是创建一个类型的实例。

现在,您有两个选择:

1.使用您的IOC管理器在没有激活器的情况创建实例-在我看来,这是做事的正确方法,可能是您正在寻找的东西。 您的IOC管理器(Unity)在注入所有依赖项时解析类型。

var instance = UnityManager.Resolve(typeName); // UnityManager is a manager that holds your unity container.

2.使用Unity获取ctor参数,并创建没有注入的实例(激活器+简单的参数传递)。 您可能不想这样做。 我将其添加为另一个解释示例。

var param1 = UnityManager.Resolve(typeOfParam1); 
var param2 = UnityManager.Resolve(typeOfParam2); 
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName, param1,param2);

好吧,你有两个选择

1)向Unity请求类的实例。 Unity将必须解析构造函数参数依赖项。 您不必在意,因为实例化是Unity的责任。 但是,由于某种原因,我猜测Unity未初始化或不可用。

2)对于“ typeName”,选择一个合适的构造函数,查看依赖关系,自己实例化依赖关系(或要求Unity为您提供依赖关系的实例),然后调用传递每个依赖关系实例的构造函数。

通过许多依赖项注入机制,依赖项是自上而下提供的,而AFAIK对于将其包含在其构造函数中的类型调用“ container.Inject(this)”是不正常的。 这种类型将与容器实现耦合,并且减少依赖关系是IOC的全部内容。

我猜“ typeName”一定不能具有默认构造函数(MissingMethodException)。

如果您在某处的静态属性中具有统一性,则可以执行以下操作:

Assembly assembly = Assembly.GetAssembly(typeAssembly);
//get the type
Type classType = assembly.GetType(typeName);

//using a static property
var instance = YourApp.Unity.Resolve(classType);

或者,您可以将参数注入要创建实例的类中。 然后像这样

        var assembly = Assembly.GetAssembly(assemblyType);
        var type = assembly.GetType(typeName);
        var instance = Activator.CreateInstance(type, parameter1, parameter2);

死路。 Unity不是.NET Framework核心的一部分。 您如何期望激活器(CreateInstance)神奇地知道这一点并调用unity方法来解决问题?

没门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM