.net6使用最小api(1)——依赖注入Autofac之构造函数注入

a1e60431e3811b02244704f645e4baf3.gif

最近与一些技术小伙伴的沟通中经常问我:微软.net6中的最小api是干什么用的?也不知道怎么用?他有什么优势?下面我会用几篇干货文章来实现最小api应用,希望能给带给小伙伴们收获。

问:.net最小api干什么用的?他有什么优势?

答:个人感觉其实用处不大,应该是微软对外的一个推广作用,显示.net6的强大,体现创建一个.net6项目只需要几个文件即可。(纯个人观点,如有误欢迎学习交流)

本文实战项目,相关代码可直接复用

github地址:https://github.com/hailang2ll/DMS.MPTEST

1

创建最小api项目

创建最小api项目比较简单,这是不具体说明,如图:

b590b0aa889f1e364f59cc275af7619f.png

2

提前准备,模块注入

引用Autofac相关包文件

<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.0" />

创建一个类名为AutofacModuleRegister,代码如下:

public class AutofacModuleRegister : Autofac.Module
{
    public string RootPath { get; set; }
    public List<string> DllFiles { get; set; }
    public AutofacModuleRegister(string rootPath, List<string> dllFiles)
    {
        RootPath = rootPath;
        DllFiles = dllFiles;
    }


    protected override void Load(ContainerBuilder builder)
    {
        foreach (var dllFile in DllFiles)
        {
            var basePath = AppContext.BaseDirectory;
            #region 接口服务注入
            var servicesDllFile = Path.Combine(RootPath, dllFile);
            if (!(File.Exists(servicesDllFile)))
            {
                var msg = $"{servicesDllFile}未找到注入的服务文件";
                throw new Exception(msg);
            }
            var assemblysServices = Assembly.LoadFrom(servicesDllFile);
            builder.RegisterAssemblyTypes(assemblysServices)
                   .AsImplementedInterfaces()//表示注册的类型,以接口的方式注册不包括IDisposable接口
                   .InstancePerLifetimeScope()//即为每一个依赖或调用创建一个单一的共享的实例
                   .EnableInterfaceInterceptors()//引用Autofac.Extras.DynamicProxy,使用接口的拦截器,在使用特性 [Attribute] 注册时,注册拦截器可注册到接口(Interface)上或其实现类(Implement)上。使用注册到接口上方式,所有的实现类都能应用到拦截器。
                   .PropertiesAutowired();//开始属性注入


            #endregion
        }


    }
}

3

依赖注入-接口定义

创建接口类名为IProductService,代码如下:

/// <summary>
/// 产品接口
/// </summary>
public interface IProductService
{
    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    Task<ProductEntityResult> GetProduct(long id);


}

4

依赖注入-服务定义

创建服务类名为ProductService,代码如下:

/// <summary>
/// 产品服务
/// </summary>
public class ProductService : IProductService
{
    /// <summary>
    /// 获取产品信息
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<ProductEntityResult> GetProduct(long id)
    {
        ProductEntityResult entity = new ProductEntityResult()
        {
            //long类型转为string输出
            Id = "1125964271981826048",
            ProductName = "aaaa",
            ProductPrice = 125.23m,
            CreatedTime = DateTime.Now,
        };
        return await Task.FromResult(entity);


    }


}

4

依赖注入-控制器定义

创建控制器类名为InjectionController,代码如下:

/// <summary>
/// autofac
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class InjectionController : ControllerBase
{
    /// <summary>
    /// 构造函数注入
    /// </summary>
    private readonly IProductService _productService;
    /// <summary>
    /// 构造函数注入
    /// </summary>


    public InjectionController(IProductService productService)
    {
        _productService = productService;
    }


    /// <summary>
    /// 我是构造函数注入
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpGet("GetProduct")]
    public async Task<ProductEntityResult> GetProduct(long id)
    {
        return await _productService.GetProduct(id);
    }
   
}

实战测试结果,调试如下图:

c6567b9bb138ba5cc8b08bed5f98302e.png

结果返回如下图:

43121272a98183b570aced3608e8886e.png

以上实现了一个简单的最小api项目的依赖注入(构造函数注入),下一节实现属性构造注入。

本文实战项目,相关代码可直接复用

github地址:https://github.com/hailang2ll/DMS.MPTEST

相关推荐

3762094460370e3a777a8017f0549145.png

点击【在看】与好朋友一起分享

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值