ActivatorUtilities.CreateInstance实现.net 下IOC的带参数的解析
引言:
一般情况下,使用.Net Core自带的IOC容器,需要提前进行接口的依赖才能注入使用。
但当我们的类使用频次少或需要带入其他参数的时候,自带的IOC容器的传统依赖注入方法就不太方便了,这个时候就需要使用 ActivatorUtilities.CreateInstance 来进行类的解析,可以实现不需要注入就能解析出具体类来。
当然,这已经不属于传统意义上的依赖注入的范畴了,但是实际开发中,这种实现反而更加便利,因为不需要注入就可以解析。
例如有下面两个类A和B,其中B类已经进行依赖,A类的构造函数含有B接口
public class ClassA
{
public ClassA(IClassB classB, string text)
{
Name = "aaa";
}
public ClassA()
{
Name = "aaa";
}
public string Name { get; set; }
}
public interface IClassB
{
}
public class ClassB : IClassB
{
}
则使用 ActivatorUtilities.CreateInstance 来进行A类的解析操作
可以看到,A类可以正常解析。
发散思维:
如果A类中包含其他含有 text 参数,构造函数,那么解析出的类A走的哪个构造函数。
这里不卖关子,直接说结论。
当ActivatorUtilities.CreateInstance 进行A类解析时,如果A类含有多个符合构造函数时,则优先解析最上面的构造函数。
如上面的解析的就是第一个构造函数。
----------------------------------2022-07-26更新--------------------------------
今天使用时报如下错误
报错的原因是,构造函数的类型与解析时不匹配
看起来不能隐式转换
解决方法也很简单,显式转换就行了。