.Net Core3.0 WebApi 项目框架搭建 七:AutoFac
.Net Core3.0 WebApi 项目框架搭建:目录
什么是IOC?什么是DI?
https://www.cnblogs.com/RayWang/p/11232911.html
https://www.cnblogs.com/RayWang/p/11128554.html
https://www.cnblogs.com/RayWang/p/11165509.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.Service"); 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<User> { /// <summary> /// 获取用户数量 /// </summary> /// <returns></returns> Task<int> GetCount(); }
UserRepository实现方法
public class UserRepository : BaseRepository<User>, IUserRepository { public async Task<int> GetCount() { var i = await Task.Run(() => UserDb.Count(x => 1 == 1)); return i; } }
IUserService也写一个接口
public interface IUserService : IBaseService<User> { /// <summary> /// 获取用户数量 /// </summary> /// <returns></returns> Task<int> GetCount(); }
之前我们BaseService里面是通过IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();有了autofac,直接构造函数注入
private readonly IBaseRepository<TEntity> baseDal; public BaseService(IBaseRepository<TEntity> baseRepository) { baseDal = baseRepository; }
UserService也需要改造一下
public class UserService : BaseService<User>, IUserService { private readonly IUserRepository userDal; public UserService(IBaseRepository<User> baseRepository, IUserRepository userRepository) : base(baseRepository) { userDal = userRepository; } public async Task<int> GetCount() { return await userDal.GetCount(); } }
User控制器也需要改造
private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; }
之前介绍sqlsugar写的测试方法是用的是new出来的UserService,这里就不需要New了。
/// <summary> /// 根据id获取数据 /// </summary> /// <param name="id">参数id</param> /// <returns></returns> [HttpGet] public async Task<IActionResult> GetUser(int id) { var user = await _userService.QueryByID(id); return Ok(user); }
我们新建一个接口用来测试autofac和刚才的新写的接口
/// <summary> /// 测试autofac /// </summary> /// <returns></returns> [HttpPost] public async Task<IActionResult> Autofac() { var count = await _userService.GetCount(); return Ok(count); }
测试AutoFac
F5运行程序,测试接口
通过断点我们可以看到userservice已经被实例化了,当然只是ioc容器帮我们干的。
返回数据库执行结果,和数据库一致
本章GIT
https://github.com/huguodong/Webapi.Core/tree/AutoFac
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/12915651.html,欢迎加入qq群927460240学习讨论