.NET5.0 依赖注入,关于 Autofac 使用
阅读原文时间:2023年07月08日阅读:2

工具

VS2019

概念

关于以下几个概念,自行百度。

控制反转:IoC(Inversion of Control)

依赖注入:

容器:DI 容器(.NET Core 自带),Autofac(本文要说明使用的)

VS2019 打开 NuGet 管理器:工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 程序包

如图,我安装了这两个

1、修改 Program.cs 文件

using 命名空间 Autofac.Extensions.DependencyInjection

这一步的操作,会替换 .NET Core 内置的 DI 容器。

public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())//添加Autofac服务
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});

2、修改 Startup.cs 文件

using 命名空间 Autofac

添加 ConfigureContainer() 方法

public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
//……
}
}

1、构造函数注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType().As();
}
}

控制器代码,其中 rtnCommon 只是一个通用 Json 返回格式,无需关注。请关注注释的几句代码。

public class AccountController : Controller
{
private IUserService _userService; //定义
public AccountController(IUserService userService)
{
_userService = userService; //完成注入
}
public async Task Login(modUser user)
{
rtnCommon rtn = new rtnCommon();
rtn = await _userService.Login(user); //调用
return Json(rtn);
}
}

对应的 Interface 和 class,定义接口和实现接口。

//接口
public interface IUserService
{
Task Login(modUser user);
}
//实现
public class UserService : IUserService
{
public async Task Login(modUser user)
{
rtnCommon rtn = new rtnCommon();
rtn = new rtnCommon(enmReturnCode.Success);
return rtn;
}
}

2、属性注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType().As().PropertiesAutowired(); //属性注入
}
}

控制器中代码

public class AccountController : Controller
{
public IUserService _userService { set; get; } //属性注入

public async Task<IActionResult> Login(modUser user)  
{  
    await \_userService.Login(user); //调用  
    //其他代码  
}  

}

3、方法注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType()..As();
builder.RegisterType().OnActivated(e => e.Instance.SetService(e.Context.Resolve())).As(); //方法注入
}
}

UserService.cs 代码

public class UserService :IUserService
{
private IUserRepository _userRepository;

public void SetService(IUserRepository userRepository)  
{  
    \_userRepository = userRepository; //方法注入  
}  

}

4、实现批量注入

需要 using 命名空间 System.Reflection

修改 Straup.cs 文件中的 ConfigureContainer() 方法

约定接口(Interface)和实现(class)都是以 Service 结尾的。

public void ConfigureContainer(ContainerBuilder builder)
{
//加载程序集
var urpIService = Assembly.Load("urp.IService");
var urpService = Assembly.Load("urp.Service");
//根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(urpIService, urpService)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().PropertiesAutowired();
}  

四、生命周期

五、Autofac 配置文件

https://www.cnblogs.com/Cjb8973/p/13858902.html (Cjb8973 的 一个非常简单的入门级ASP.NET Core Autofac使用)

https://www.cnblogs.com/baocaige/p/11987902.html (Liu_Cabbage 的 FineAdmin.Mvc 使用ok-admin+ASP.NET MVC搭建的通用权限后台管理系统)【参考了是他的开源项目,不过项目是MVC5的】

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章