在.Net WebApi开发过程中,肯定会有很多的业务模块,会有很多的类需要注入,如果一个个去注入的话,未免有些过于麻烦而且代码的可读性也会比较差。所以往往这个时候我们就会考虑有没有一种批量注入的方式?一劳永逸。
1.首先创建一个批量注入的特性类AppServiceAttribute
,然后在类中实现以下代码
public class AppServiceAttribute : Attribute
{
public ServiceLifeType ServiceLifeType { get; set; } = ServiceLifeType.Singleton;
public Type ServiceType { get; set; }
}
public enum ServiceLifeType
{
Transient, Scoped, Singleton
}
2.对所有使用此特性的类进行注入处理
代码语言:javascript复制 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;
}
}
}
}
}
}
3.在Program
中进行注入调用
builder.Services.AddAppService("Services");
4.分别新建一个Service的接口层以及实现类,在实现类上面使用该特性
代码语言:javascript复制[AppService(ServiceType = typeof(ISystemService))]
public class SystemService : ISystemService
{
public int Add(int a, int b)
{
return a b;
}
}
5.以上若需要其他的的生命周期注入,可以在使用特性时对ServiceLifeType
进行赋值
[AppService(ServiceLifeType =ServiceLifeType.Scoped,ServiceType = typeof(ISystemService))]
就这样,批量注入实现了。这只是其中一种方式,还有更多的方式,值得研究一番。