.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

 

posted @ 2020-05-19 10:53  HuTiger  阅读(4858)  评论(13编辑  收藏  举报