在重构园子品牌专区代码时,将下面的 MediatR Handler 实现
public class ListArticlesQueryHandler(IArticleRepository articleRepository)
: EfPageableQueryHandler<ListArticlesQuery, Article, ArticleDto>
{
// ...
}
改为泛型
public class ListArticlesQueryHandler<T>(IArticleRepository articleRepository)
: EfPageableQueryHandler<ListArticlesQuery<T>, Article, T>
{
// ...
}
运行时却出现下面的错误
No service for type 'MediatR.IRequestHandler`2[Cnblogs.ListArticlesQuery`1[Cnblogs.ArticleLiteDto],Cnblogs.PagedList`1[Cnblogs.ArticleLiteDto]]' has been registered.
请问如何解决这个问题?
原来 MediatR 默认不会注册泛型 handler,参考 SO 上的回答,通过下面的配置启用
services.AddMediatR(cfg =>
{
//...
cfg.RegisterGenericHandlers = true;
});
但出现新的错误
System.ArgumentException : Error registering the generic type: . One of the generic type parameter's count of types that can close exceeds the maximum length allowed (100).
Stack Trace:
at MediatR.Registration.ServiceRegistrar.GenerateCombinations(Type requestType, List`1 lists, Int32 depth, CancellationToken cancellationToken)
上面新出现的错误是 where class
泛型约束引起的,通过引入一个 IDto
接口解决了
where IDto
public class ListArticlesQueryHandler<T>(IArticleRepository articleRepository)
: EfPageableQueryHandler<ListArticlesQuery<T>, Article, T>
where T : IDto
{ }
public class ArticleLiteDto : IDto
{
// ...
}
services.AddMediatR(cfg =>
{
cfg.RegisterGenericHandlers = true;
cfg.RegisterServicesFromAssemblies(
typeof(GetBrandMemberQuery).Assembly,
typeof(IDto).Assembly);
});