泛型命令处理程序的依赖注入实现方案咨询
泛型查询处理程序的依赖注入问题
我定义了如下命令:
public record GetEnumQuery<TEnum>( ) : IBaseCommandQuery<IList<EnumViewModel>> where TEnum : Enum;
以及对应的处理程序:
public class GetEnumQueryHandler<TEnum> : IBaseCommandQueryHandler<GetEnumQuery<TEnum>, IList<EnumViewModel>> where TEnum : Enum
请问如何注入该泛型处理程序,使其支持所有不同枚举类型的使用场景?
解答
ASP.NET Core 内置DI容器
直接注册开放泛型类型即可,容器会自动为具体枚举类型生成对应的处理程序实例:
// 在Program.cs或Startup.cs的服务配置代码里 builder.Services.AddScoped( typeof(IBaseCommandQueryHandler<,>), typeof(GetEnumQueryHandler<>) );
要是想更精准地只匹配GetEnumQuery<TEnum>对应的处理程序,可以这么写:
builder.Services.AddScoped( typeof(IBaseCommandQueryHandler<GetEnumQuery<>, IList<EnumViewModel>>), typeof(GetEnumQueryHandler<>) );
Autofac 容器
用Autofac的话,注册方式同样简单直接:
var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterGeneric(typeof(GetEnumQueryHandler<>)) .As(typeof(IBaseCommandQueryHandler<,>)) .InstancePerLifetimeScope();
Autofac会自动处理泛型参数匹配,当你需要某个枚举类型的处理程序时,它会自动生成对应的泛型实现。
注意点
- 确认
IBaseCommandQueryHandler<,>是泛型接口,且GetEnumQueryHandler<TEnum>严格遵循了泛型约束(where TEnum : Enum)。 - 生命周期选择(Scoped/Transient/Singleton)根据业务需求来,一般命令/查询处理程序用Scoped就够了。
内容的提问来源于stack exchange,提问作者Behzad Dara
相关产品推荐
相关产品推荐

