zoukankan      html  css  js  c++  java
  • .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)
            {
    
                User 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

  • 相关阅读:
    微信小程序登入实现
    CacheLab实验--深入了解计算机系统实验
    power designer的物理数据模型生成数据字典。
    PowerDesigner15在生成SQL时报错Generation aborted due to errors detected during the verification of the mo
    Mac系统下,如何申请并安装教育版Navicat
    Mac下修改Mysql密码
    数组
    AbstractList源码阅读
    List源码阅读笔记
    AbstractCollection源码阅读笔记
  • 原文地址:https://www.cnblogs.com/huguodong/p/12915651.html
Copyright © 2011-2022 走看看