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