.Net Core3.0 WebApi 項目框架搭建:目錄
什么是IOC?什么是DI?
網上好多介紹這些概念的。我之前的隨筆也有介紹過。
網上看到的一片介紹相關概念的。
https://www.cnblogs.com/Steven-HU/p/13224340.html
常用的IOC框架
Autofac:貌似目前net下用的最多吧
Ninject:目前好像沒多少人用了
Unity:也是較為常見
微軟 core 自帶的 DI
安裝AutoFac
在Nuget中引入兩個:Autofac.Extras.DynamicProxy(Autofac的動態代理,它依賴Autofac,所以可以不用單獨引入Autofac)、Autofac.Extensions.DependencyInjection(Autofac的擴展)
配置容器,注入服務
在startup.cs 文件中,增加一個ConfigureContainer方法,用來配置Autofac 服務容器
public void ConfigureContainer(ContainerBuilder builder) { }
SetUp文件夾新建AutofacModuleRegister.cs並繼承Autofac.Module
重寫Load方法
public class AutofacModuleRegister: Autofac.Module { protected override void Load(ContainerBuilder builder) { //注冊Service var assemblysServices = Assembly.Load("WebApi.Core.Services"); builder.RegisterAssemblyTypes(assemblysServices) .InstancePerDependency()//瞬時單例 .AsImplementedInterfaces()////自動以其實現的所有接口類型暴露(包括IDisposable接口) .EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy; //注冊Repository var assemblysRepository = Assembly.Load("WebApi.Core.Repository"); builder.RegisterAssemblyTypes(assemblysRepository) .InstancePerDependency()//瞬時單例 .AsImplementedInterfaces()////自動以其實現的所有接口類型暴露(包括IDisposable接口) .EnableInterfaceInterceptors(); //引用Autofac.Extras.DynamicProxy; } }
從ConfigureContainer中注冊AutofacModuleRegister
public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterModule(new AutofacModuleRegister()); }
在 Program.cs 文件中,配置 UseServiceProviderFactory
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory())//<--NOTE THIS .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
通過構造函數注入
這里我們在IUserRepository接口新增一個方法
public interface IUserRepository : IBaseRepository<UserNew> { /// <summary> /// 獲取用戶數量 /// </summary> /// <returns></returns> Task<int> GetCount(); }
UserRepository實現方法
public class UserRepository : BaseRepository<UserNew>, IUserRepository { public Task<int> GetCount() { return Task.FromResult(100); } }
IUserService也寫一個接口
public interface IUserService : IBaseServices<UserNew> { /// <summary> /// 獲取用戶數量 /// </summary> /// <returns></returns> Task<int> GetCount(); }
之前我們BaseService里面是通過IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();有了autofac,直接構造函數注入
//public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>(); private readonly IBaseRepository<TEntity> baseDal; public BaseServices(IBaseRepository<TEntity> baseRepository) { baseDal = baseRepository; }
UserService也需要改造一下
public class UserService : BaseServices<UserNew>, IUserService { private readonly IUserRepository userDal; public UserService(IBaseRepository<UserNew> baseRepository, IUserRepository userRepository) : base(baseRepository) { userDal = userRepository; } public Task<int> GetCount() { return Task.FromResult(101); } }
User控制器也需要改造
private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; }
/// <summary> /// 添加數據 /// </summary> /// <param name="user">參數user</param> /// <returns></returns> [HttpGet("{id}", Name = "Get")] public async Task<IActionResult> Add(UserNew user) { //IUserService userService = new UserService(); var count = await _userService.Add(user); return Ok(count); }
我們新建一個接口用來測試autofac和剛才的新寫的接口
/// <summary> /// 測試autofac /// </summary> /// <returns></returns> [HttpPost] public async Task<IActionResult> Autofac() { var count = await _userService.GetCount(); return Ok(count); }
測試AutoFac
運行程序,測試接口