.Net6 WebApi实现批量注入

前言:在.Net WebApi开发过程中,肯定会有很多的业务模块,会有很多的类需要注入,如果一个个去注入的话,未免有些过于麻烦而且代码的可读性也会比较差。所以往往这个时候我们就会考虑有没有一种批量注入的方式?一劳永逸。

答案肯定是有的,而且不只一种。以下方式是我一直在使用也是非常喜欢的一种方式(发现我个人特别喜欢用特性来做一些事情)。这种方式其实也是最开始学CORE的时候,在某开源框架上看到的(具体什么名字也忘记了,这位老师的这套框架与我个人的开发习惯不谋而合,当时甚是喜欢,很多东西影响至今);

5a455d724c28594be777bf533d184d7f.png

  1. 在开始之前,首先要声明一件事,就是我们的架构一开始要保证是分离的,当然这也是最基础的。由于这里只是用来实现批量注入,所以只把Service成分离出来就好了,至于Service的接口层也一并放一起处理了。

    60342e1837ef7e0b27bfbd7dc133f628.png

  2. 首先创建一个批量注入的特性类AppServiceAttribute,然后在类中实现以下代码:

    public class AppServiceAttribute : Attribute
    {
            public ServiceLifeType ServiceLifeType { get; set; } = ServiceLifeType.Singleton;
            public Type ServiceType { get; set; }
        }
        public enum ServiceLifeType
    {
            Transient, Scoped, Singleton
        }
  1. 对所有使用此特性的类进行注入处理

public static class AppService
    {
        public static void AddAppService(this IServiceCollection services,params string[] assemblyNames)
        {
            foreach (var name in assemblyNames)
            {
                Assembly assembly = Assembly.Load(name);
                foreach (var type in assembly.GetTypes())
                {
                    var serviceAttribute = type.GetCustomAttribute<AppServiceAttribute>();
                    if (serviceAttribute != null)
                    {
                        var serviceType = serviceAttribute.ServiceType;
                        switch (serviceAttribute.ServiceLifeType)
                        {
                            case ServiceLifeType.Singleton:
                                services.AddSingleton(serviceType, type);
                                break;
                            case ServiceLifeType.Scoped:
                                services.AddScoped(serviceType, type);
                                break;
                            case ServiceLifeType.Transient:
                                services.AddTransient(serviceType, type);
                                break;
                            default:
                                services.AddTransient(serviceType, type);
                                break;
                        }
                    }
                }
            }
        }
    }
  1. Program中进行注入调用

builder.Services.AddAppService("Services");
  1. 分别新建一个Service的接口层以及实现类,在实现类上面使用该特性

[AppService(ServiceType = typeof(ISystemService))]
    public class SystemService : ISystemService
    {
        public int Add(int a, int b)
        {
            return a+b;
        }
    }
  1. 以上若需要其他的的生命周期注入,可以在使用特性时对ServiceLifeType进行赋值

[AppService(ServiceLifeType =ServiceLifeType.Scoped,ServiceType = typeof(ISystemService))]
  1. 当然肯定也有人会觉得这不是也麻烦吗?无非是换了个地方进行注入。依然每个都要写一遍......可是,可是。我们不都是会使用代码生成器的吗?难道这一个表一套仓储模式的结构,你都是自己写出来的???

  2. -

  3. 技术群:添加小编微信并备注进群

    小编微信:mm1552923   

    公众号:dotNet编程大全    

4e72a52a6a95bab3f400e4a7c738a2c2.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值