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更新--------------------------------

今天使用时报如下错误

 

 

 报错的原因是,构造函数的类型与解析时不匹配

 

 

 

看起来不能隐式转换

 解决方法也很简单,显式转换就行了。

 

posted on 2022-07-21 10:58  鲁广广  阅读(365)  评论(0编辑  收藏  举报

导航