.NET5.0 依赖注入,关于 Autofac 使用
前置
工具
VS2019
概念
关于以下几个概念,自行百度。
控制反转:IoC(Inversion of Control)
依赖注入:
容器:DI 容器(.NET Core 自带),Autofac(本文要说明使用的)
一、安装 Autofac
VS2019 打开 NuGet 管理器:工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 程序包
如图,我安装了这两个
二、在项目中使用 Autofac
1、修改 Program.cs 文件
using 命名空间 Autofac.Extensions.DependencyInjection
这一步的操作,会替换 .NET Core 内置的 DI 容器。
1 2 3 4 5 6 7 8 9 10 11 12 | 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<Startup>(); }); |
2、修改 Startup.cs 文件
using 命名空间 Autofac
添加 ConfigureContainer() 方法
1 2 3 4 5 6 7 8 | public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { //…… } } |
三、多种注入方式
1、构造函数注入
修改 Startup.cs 里面 ConfigureContainer() 方法
1 2 3 4 5 6 7 8 | public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>(); } } |
控制器代码,其中 rtnCommon 只是一个通用 Json 返回格式,无需关注。请关注注释的几句代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class AccountController : Controller { private IUserService _userService; //定义 public AccountController(IUserService userService) { _userService = userService; //完成注入 } public async Task<IActionResult> Login(modUser user) { rtnCommon rtn = new rtnCommon(); rtn = await _userService.Login(user); //调用 return Json(rtn); } } |
对应的 Interface 和 class,定义接口和实现接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //接口 public interface IUserService { Task<rtnCommon> Login(modUser user); } //实现 public class UserService : IUserService { public async Task<rtnCommon> Login(modUser user) { rtnCommon rtn = new rtnCommon(); rtn = new rtnCommon(enmReturnCode.Success); return rtn; } } |
2、属性注入
修改 Startup.cs 里面 ConfigureContainer() 方法
1 2 3 4 5 6 7 8 | public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>().PropertiesAutowired(); //属性注入 } } |
控制器中代码
1 2 3 4 5 6 7 8 9 10 | public class AccountController : Controller { public IUserService _userService { set ; get ; } //属性注入 public async Task<IActionResult> Login(modUser user) { await _userService.Login(user); //调用 //其他代码 } } |
3、方法注入
修改 Startup.cs 里面 ConfigureContainer() 方法
1 2 3 4 5 6 7 8 9 | public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<UserRepository>()..As<IUserRepository>(); builder.RegisterType<UserService>().OnActivated(e => e.Instance.SetService(e.Context.Resolve<IUserRepository>())).As<IUserService>(); //方法注入 } } |
UserService.cs 代码
1 2 3 4 5 6 7 8 9 | public class UserService :IUserService { private IUserRepository _userRepository; public void SetService(IUserRepository userRepository) { _userRepository = userRepository; //方法注入 } } |
4、实现批量注入
需要 using 命名空间 System.Reflection
修改 Straup.cs 文件中的 ConfigureContainer() 方法
约定接口(Interface)和实现(class)都是以 Service 结尾的。
1 2 3 4 5 6 7 8 9 10 | 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的】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了