前置
工具
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的】