.NET Core依赖注入有三种方式是真的吗?

当面试官问到这个问题的时候,你可能会脱口而出,这不就是“属性注入、接口注入、构造函数注入”这三类吗?没有错,如果按照网上标准答案是这么回答;还有你实验过没有?但是这个回答从.NET Core自带注入容器的角度上来说是错的,目前.NET Core自带容器只支持构造函数注入。这个答案来源应该是JAVA的注入方式,大家感兴趣可以找找,当然你也可以改造一下,让.NET Core自带依赖注入容器支持属性注入。另外第三方注入容器是支持的,比如autofac,他支持属性注入,构造函数注入等。.

扩展

下面我们看看第三方注入容器autofac的使用。

1、环境准备

首先新建一个.NET 6 的MVC项目,在项目中添加autofac的nuget包。

install-package Autofacinstall-package Autofac.Extensions.DependencyInjection

然后在Program.cs文件中添加Autofac,替换到内置的DI,代码如下

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()) ;

2、使用autofac注入

    在新建的这个解决方案中新建一个项目,项目里包含一个接口和一个实现的类,并创建一个方法用来测试调用情况。代码如下

    public interface ITestIoc//接口    {        string GetIocType(string typename);    }    public class TestIoc : ITestIoc//实现接口的类    {  //测试方法:        public string GetIocType(string typename)        {            return typename;        }   }

在Program.cs文件注入这个类

builder.Host.ConfigureContainer<ContainerBuilder>(container =>{  //这里使用单例注册     container.RegisterType<TestIoc>().As<ITestIoc>().SingleInstance();});
autofac注入生命周期:
1、瞬时 InstancePerDependency:每次获取的服务实例都不一样;
2、单例 SingleInstance:在整个容器中获取的服务实例都是同一个;
3、作用域 InstancePerLifetimeScope:相同作用域下获取到的服务实例相同;
4、作用域 InstancePerMatchingLifetimeScope(“作用域名称”):可以指定到某一个具体作用域;
5、每次请求 InstancePerRequest:不同的请求获取的服务实例不一样;
6、隐式关系类型的嵌套作用域 InstancePerOwned:可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例。
大家可以根据自己的需求来使用。
 
3、在控制器里通过构造函数注入
这个跟.NET Core自带的注入一样,如下:
        private readonly ITestIoc testIoc;        public WeatherForecastController( ITestIoc testIoc)        {            this.testIoc = testIoc;        }        [HttpGet(Name = "GetWeatherForecast")]        public IEnumerable<WeatherForecast> Get()        {            var IocType= testIoc.GetIocType("构造函数");            Console.WriteLine("注入类型:"+ IocType);         } //控制台将打印:注入类型:构造函数
这样就成功地实现了容器autofac的注入。
另外还有属性注入和方法注入,由于篇幅问题这里就不举例了,感兴趣的伙伴可以自己尝试一下。

结语

    本文介绍了.NET Core依赖注入的方式的真伪,仅供参考。对于面试官的提问大家应该敢于发现其中的问题,并委婉的指出问题所在和问题的解决方案,这样更受面试官的青睐。希望本文给大家带来收获,对于本文欢迎大家留言讨论。