如何在NuGet包中添加带动态生命周期的依赖注入服务?
如何更简洁地实现带ServiceLifetime参数的DI服务注册扩展方法?
我想在NuGet包中添加一个接收ServiceLifetime lifetime参数的扩展方法,通过该参数将服务注册到DI容器中。目前我已经实现了以下代码:
public static void AddProvider(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Singleton) { var descriptor = new ServiceDescriptor( typeof(IEnvironmentVariableProvider), typeof(EnvironmentVariableProvider), lifetime); services.Add(descriptor); }
请问有没有更简洁的实现方式?
当然有更简洁的写法,推荐两种常规实现方式:
方式一:使用Switch分支(可读性最优)
直接根据传入的lifetime参数,调用.NET DI框架提供的对应扩展方法,代码直观且符合常规写法:
public static void AddProvider(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Singleton) { switch (lifetime) { case ServiceLifetime.Singleton: services.AddSingleton<IEnvironmentVariableProvider, EnvironmentVariableProvider>(); break; case ServiceLifetime.Scoped: services.AddScoped<IEnvironmentVariableProvider, EnvironmentVariableProvider>(); break; case ServiceLifetime.Transient: services.AddTransient<IEnvironmentVariableProvider, EnvironmentVariableProvider>(); break; } }
方式二:使用字典映射(代码更紧凑)
如果偏好更紧凑的写法,可以提前注册生命周期与注册方法的映射关系,直接根据参数调用对应逻辑:
public static void AddProvider(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Singleton) { var registry = new Dictionary<ServiceLifetime, Action<IServiceCollection>> { [ServiceLifetime.Singleton] = s => s.AddSingleton<IEnvironmentVariableProvider, EnvironmentVariableProvider>(), [ServiceLifetime.Scoped] = s => s.AddScoped<IEnvironmentVariableProvider, EnvironmentVariableProvider>(), [ServiceLifetime.Transient] = s => s.AddTransient<IEnvironmentVariableProvider, EnvironmentVariableProvider>() }; registry[lifetime](services); }
对比你的原始实现,第一种switch写法的可读性更强,也是.NET生态中DI扩展方法的常见写法;第二种字典映射则更适合需要批量扩展或复用映射关系的场景。
内容的提问来源于stack exchange,提问作者Yuriy Gavrishov
相关产品推荐
相关产品推荐

