.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 @   HuTiger  阅读(4894)  评论(13编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示