首页 新闻 会员 周边 捐助

.NET:MediatR 报错 "No service for type 'MediatR.IRequestHandler`2[...]' has been registered"

0
悬赏园豆:30 [已解决问题] 解决于 2025-10-07 12:35

在重构园子品牌专区代码时,将下面的 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.

请问如何解决这个问题?

dudu的主页 dudu | 高人七级 | 园豆:24830
提问于:2025-10-06 11:52
<
分享
最佳答案
0

原来 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)
dudu | 高人七级 |园豆:24830 | 2025-10-06 13:55

上面新出现的错误是 where class 泛型约束引起的,通过引入一个 IDto 接口解决了

  • 泛型约束改为 where IDto
public class ListArticlesQueryHandler<T>(IArticleRepository articleRepository)
    : EfPageableQueryHandler<ListArticlesQuery<T>, Article, T>
    where T : IDto
{ }
  • ArticleLiteDto 实现 IDto 接口
public class ArticleLiteDto : IDto
{
    // ...
}
  • 注册 IDto 接口所在的 Assembly
services.AddMediatR(cfg =>
{
    cfg.RegisterGenericHandlers = true;
    cfg.RegisterServicesFromAssemblies(
        typeof(GetBrandMemberQuery).Assembly,
        typeof(IDto).Assembly);
});
dudu | 园豆:24830 (高人七级) | 2025-10-07 12:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册