.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM