前言:在.Net WebApi开发过程中,肯定会有很多的业务模块,会有很多的类需要注入,如果一个个去注入的话,未免有些过于麻烦而且代码的可读性也会比较差。所以往往这个时候我们就会考虑有没有一种批量注入的方式?一劳永逸。
答案肯定是有的,而且不只一种。以下方式是我一直在使用也是非常喜欢的一种方式(发现我个人特别喜欢用特性来做一些事情)。这种方式其实也是最开始学CORE的时候,在某开源框架上看到的(具体什么名字也忘记了,这位老师的这套框架与我个人的开发习惯不谋而合,当时甚是喜欢,很多东西影响至今);.
-
在开始之前,首先要声明一件事,就是我们的架构一开始要保证是分离的,当然这也是最基础的。由于这里只是用来实现批量注入,所以只把Service成分离出来就好了,至于Service的接口层也一并放一起处理了。

-
首先创建一个批量注入的特性类
AppServiceAttribute,然后在类中实现以下代码:public class AppServiceAttribute : Attribute{public ServiceLifeType ServiceLifeType { get; set; } = ServiceLifeType.Singleton;public Type ServiceType { get; set; }}public enum ServiceLifeType{Transient, Scoped, Singleton}
-
对所有使用此特性的类进行注入处理
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;}}}}}}
-
在
Program中进行注入调用
builder.Services.AddAppService("Services");-
分别新建一个Service的接口层以及实现类,在实现类上面使用该特性
[AppService(ServiceType = typeof(ISystemService))]public class SystemService : ISystemService{public int Add(int a, int b){return a+b;}}
-
以上若需要其他的的生命周期注入,可以在使用特性时对
ServiceLifeType进行赋值
[AppService(ServiceLifeType =ServiceLifeType.Scoped,ServiceType = typeof(ISystemService))]-
当然肯定也有人会觉得这不是也麻烦吗?无非是换了个地方进行注入。依然每个都要写一遍......可是,可是。我们不都是会使用代码生成器的吗?难道这一个表一套仓储模式的结构,你都是自己写出来的???