前置
工具
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 容器。
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() 方法
public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { //…… } }
三、多种注入方式
1、构造函数注入
修改 Startup.cs 里面 ConfigureContainer() 方法
public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>(); } }
控制器代码,其中 rtnCommon 只是一个通用 Json 返回格式,无需关注。请关注注释的几句代码。
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,定义接口和实现接口。
//接口 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() 方法
public class Startup { //其他代码 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>().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<UserRepository>()..As<IUserRepository>(); builder.RegisterType<UserService>().OnActivated(e => e.Instance.SetService(e.Context.Resolve<IUserRepository>())).As<IUserService>(); //方法注入 } }
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的】