面试疑问:.NET Core依赖注入有三种方式是真的吗?

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

扩展

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

1、环境准备

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

install-package Autofac
install-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依赖注入的方式的真伪,仅供参考。对于面试官的提问大家应该敢于发现其中的问题,并委婉的指出问题所在和问题的解决方案,这样更受面试官的青睐。希望本文给大家带来收获,对于本文欢迎大家留言讨论。

技术群:添加小编微信并备注进群
小编微信:mm1552923   公众号:dotNet编程大全
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值