• .Net Core3.0 WebApi 七:AutoFac


    .Net Core3.0 WebApi 项目框架搭建:目录

    什么是IOC?什么是DI?

    网上好多介绍这些概念的。我之前的随笔也有介绍过。

    网上看到的一片介绍相关概念的。

    https://www.cnblogs.com/Steven-HU/p/13224340.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.Services");
            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<UserNew>
     {
         /// <summary>
         /// 获取用户数量
         /// </summary>
         /// <returns></returns>
         Task<int> GetCount();
     }

    UserRepository实现方法

     public class UserRepository : BaseRepository<UserNew>, IUserRepository
     {
         public Task<int> GetCount()
         {
             return Task.FromResult(100);
         }
     }

    IUserService也写一个接口

     public interface IUserService : IBaseServices<UserNew>
     {
         /// <summary>
         /// 获取用户数量
         /// </summary>
         /// <returns></returns>
         Task<int> GetCount();
     }

    之前我们BaseService里面是通过IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();有了autofac,直接构造函数注入

    //public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();
    private readonly IBaseRepository<TEntity> baseDal;
    public BaseServices(IBaseRepository<TEntity> baseRepository)
    {
        baseDal = baseRepository;
    }

    UserService也需要改造一下

    public class UserService : BaseServices<UserNew>, IUserService
    {
        private readonly IUserRepository userDal;
        public UserService(IBaseRepository<UserNew> baseRepository, IUserRepository userRepository) : base(baseRepository)
        {
            userDal = userRepository;
        }
        public Task<int> GetCount()
        {
            return Task.FromResult(101);
        }
    }

    User控制器也需要改造

    private readonly IUserService _userService;
    public UserController(IUserService userService)
    {
        _userService = userService;
    }
    /// <summary>
    /// 添加数据
    /// </summary>
    /// <param name="user">参数user</param>
    /// <returns></returns>
    [HttpGet("{id}", Name = "Get")]
    public async Task<IActionResult> Add(UserNew user)
    {
        //IUserService userService = new UserService();
        var count = await _userService.Add(user);
        return Ok(count);
    }

    我们新建一个接口用来测试autofac和刚才的新写的接口

    /// <summary>
    /// 测试autofac
    /// </summary>
    /// <returns></returns>
    [HttpPost]
    public async Task<IActionResult> Autofac()
    {
        var count = await _userService.GetCount();
    
        return Ok(count);
    }

    测试AutoFac

    运行程序,测试接口

     

     

  • 相关阅读:
    [题解]小X的液体混合
    [题解]图的遍历
    [模板]基本线段树操作
    C#中 Excel列字母与数字的相互转换
    Oracle 查询数据库表大小
    vi/vim 编辑、搜索、查找、定位
    Linux 中 sqlite3 基本操作
    MessageBox.Show 消息提示框显示到窗口最顶层
    Docker bash: ping: command not found 解决方法
    PLSQL F8执行单条SQL
  • 原文地址:https://www.cnblogs.com/taotaozhuanyong/p/13794359.html
Copyright © 2020-2023  润新知