.Net Core中使用Autofac替换自带的DI容器的示例

为什么叫浅谈呢?就是字面上的意思,讲得比较浅,又不是不能用(这样是不对的)!!!

Aufofac大家都不陌生了,说是.Net生态下最优秀的IOC框架那是一点都过分。用的人多了,使用教程也十分丰富,官网教程也比较详细(如果英文功底还不错的话)。

那我为什么还要写这样一篇博客呢,一是用作学习笔记,二就是闲的。

废话不多说,开始正文

项目创建

云创建一个.Net Core Api项目,然后再添加一个类库,大概就是下面这样的结构:

.Net Core中使用Autofac替换自带的DI容器的示例

新建一个类库项目,分别添加一个接口文件与类文件:

.Net Core中使用Autofac替换自带的DI容器的示例

就这样,我们的演示方案就搭建完成了,下面就到了演示阶段。

方案演示

原始方案

俗话说的好,没有对象 new 一个就对了:

[HttpGet] public string Original() { IUserService userService = new UserService(); return userService.GetName("Original"); }

结果当然是没问题的:

.Net Core中使用Autofac替换自带的DI容器的示例

.Net Core自带DI

微软给我们提供的 DI 解决方案。如果是小项目,需要注入的服务不多,简直无敌好用,缺点就是不能批量注入,下面我们来复习一下:

先在 Startup 里面的 ConfigureServices 方法内注入(默认且只能构造函数注入)

services.AddScoped<IUserService, UserService>();

然后在控制器中拿到刚才注入的服务:

public class DefaultController : ControllerBase { private readonly IUserService userService; public DefaultController(IUserService _userService) { this.userService = _userService; } [HttpGet] public string CoreDI() { return userService.GetName("CoreDI"); } }

很显然,一点问题都没有:

.Net Core中使用Autofac替换自带的DI容器的示例

Autofac

注意事项说在前面:

在 .Net Core2 中一般是把Startup的ConfigureServices方法返回值类型改为IServiceProvider,然后通过构建Autofac容器并注入服务后返回。

在 .Net Core3.0之后,集成方式做了部分调整

下面演示的版本是.Net Core 3.1,也就是调整后的版本。

1、先引用 Autofac 的包,看看这下载次数

.Net Core中使用Autofac替换自带的DI容器的示例

2、在 Program 中改用 Autofac 来实现依赖注入

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 就是这句 .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });

3、添加我们自定义的 Autofac 注册类,并注册我们需要的服务(默认构造函数注入,支持属性注入)

public class AutofacModuleRegister : Autofac.Module { //重写Autofac管道Load方法,在这里注册注入 protected override void Load(ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>();    } }

4、在 Startup 类中添加方法:ConfigureContainer,

public void ConfigureContainer(ContainerBuilder builder) { // 直接用Autofac注册我们自定义的 builder.RegisterModule(new AutofacModuleRegister()); }

5、大功告成,控制器内的方法甚至不用去改

public class DefaultController : ControllerBase { private readonly IUserService userService; public DefaultController(IUserService _userService) { this.userService = _userService; } [HttpGet] public string Autofac() { return userService.GetName("Autofac"); } }

.Net Core中使用Autofac替换自带的DI容器的示例

演示到这里就结束了,是不是感觉 Autofac 比自带的 DI 还要麻烦。其实不然,下面我们就来看看 Autofac 对比自带 DI 的一些特有特性。

不同的特性 批量注入

之前的项目我们有了用户 UserService,需求更新,加入了商品(ProductService),有了商品那又怎么能少得了订单(OrderService),那后面是不是还得有售后、物流、仓库、营销......

如果是.Net Core 自带的注入框架,那就只能不停的:

services.AddScoped<IProductService, ProductService>(); services.AddScoped<IOrderService, OrderService>(); ......

这时候,Autofac 的好处就体现出来了:批量注入。

我们先回到上面的:AutofacModuleRegister 类,加入下面这段代码:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfdgz.html