Assembly.CreateInstance来解析IoC Container

use*_*252 6 c# reflection ioc-container unity-container

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

Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName); //throws MissingMethodException
Type classType = instance.GetType();
Run Code Online (Sandbox Code Playgroud)

但是,我试图实例化的类在构造函数中有两个参数,由Unity IoC容器解析.

当我执行上面的代码时,它会抛出'System.MissingMethodException'.

我在网上搜索过,看起来Assembly.CreateInstance将无法解析Unity依赖注入.

这是一个死胡同还是有一种方法可以使用"CreateInstance"方法实例化该类并解析Unity依赖关系?

Ami*_*ich 6

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

(T)Activator.CreateInstance(typeof(T), param1, param2);
Run Code Online (Sandbox Code Playgroud)

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

现在你有两个选择:

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

var instance = UnityManager.Resolve(typeName); // UnityManager is a manager that holds your unity container.
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)


小智 -4

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

决不。

  • 在 15 分钟的编码内,您可以拥有一个简单的函数,可以递归地解析构造函数参数。这绝对不是死胡同。 (3认同)