组装.创建实例解析IoC容器



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

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

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

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

我已经在网上搜索了,它似乎是组装。创建实例将无法解析Unity依赖注入。

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

CreateInstance可以接收参数,你可以这样调用它:

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

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

现在你有两个选择:

1。使用您的IOC管理器创建没有激活器的实例—在我看来,这是正确的做事方式,可能也是您正在寻找的。你的IOC管理器(Unity)在注入所有依赖的同时解析类型。

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

2。使用Unity获取参数并创建实例,而不需要注入(Activator +简单的参数传递)。你可能不想这么做。我添加了这个作为另一个解释性示例。

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给你依赖项的实例),然后调用构造函数传递每个依赖项的实例。

在许多依赖注入机制中,依赖是自上而下提供的,并且据我所知,在类型的构造函数中包含对"container.Inject(this)"的调用是不正常的。这样的类型将与容器实现耦合,减少依赖关系是IOC的全部内容之一。

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

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

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

如果你有统一的静态属性,你可以这样做:

Assembly assembly = Assembly.GetAssembly(typeAssembly);
//get the type
Type classType = assembly.GetType(typeName);
//using a static property
var instance = YourApp.Unity.Resolve(classType);

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

不可能。

相关内容

  • 没有找到相关文章

最新更新