.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

运行程序,测试接口

 

 

 

 

 

posted @   冰乐  阅读(1040)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示