.Net6 WebApi实现批量注入

2023-11-05 16:42:26 浏览数 (1)

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

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

代码语言:javascript复制
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中进行注入调用

代码语言:javascript复制
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进行赋值

代码语言:javascript复制
[AppService(ServiceLifeType =ServiceLifeType.Scoped,ServiceType = typeof(ISystemService))]

就这样,批量注入实现了。这只是其中一种方式,还有更多的方式,值得研究一番。

0 人点赞