.Net6 WebApi实现批量注入

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

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

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

    .Net6 WebApi实现批量注入

  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. 当然肯定也有人会觉得这不是也麻烦吗?无非是换了个地方进行注入。依然每个都要写一遍......可是,可是。我们不都是会使用代码生成器的吗?难道这一个表一套仓储模式的结构,你都是自己写出来的???