Assembly.CreateInstance来解析IoC Container

时间:2014-06-17 06:29:21

标签: c# reflection unity-container 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依赖关系?

5 个答案:

答案 0 :(得分:3)

CreateInstance可以接收params,你可以用ctor params这样调用它:

(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 params并创建不带注入的实例(Activator +简单参数传递)。 你很可能不想这样做。我已将此添加为另一个解释示例。

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

答案 1 :(得分:1)

嗯,你有两个选择

1)向Unity询问该类的实例。 Unity必须解决构造函数参数依赖项。你并不关心,因为Unity有责任为你提供一个实例。但是,由于某种原因,我猜测Unity尚未初始化或无法使用。

2)对于" typeName",选择一个合适的构造函数,查看依赖项,自己实例化依赖项(或让Unity给你依赖项的实例),然后调用传入的构造函数每个依赖的实例。

对于许多依赖注入机制,依赖关系是自上而下提供的,而AFAIK对于在其构造函数中包含对" container.Inject(this)"的调用的类型来说并不正常。这样的类型将耦合到容器实现,并且减少依赖性是IOC的一部分。

我猜" typeName"必须没有默认构造函数(MissingMethodException)。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-2)

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

没办法。