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更新--------------------------------
今天使用时报如下错误
报错的原因是,构造函数的类型与解析时不匹配
看起来不能隐式转换
解决方法也很简单,显式转换就行了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构