【问题标题】:Is it possible to handle one query but with different handlers using mediatR?是否可以使用 mediatR 处理一个查询但使用不同的处理程序?
【发布时间】:2019-09-05 11:30:43
【问题描述】:

我正在使用 ninject + mediatR。我有从不同接口继承方法的类:

class Query : IRequest<IReadOnlyList<QueryResult>>, interfaceName1, interfaceName2
{
    public string methodFromFirstInterface();
    public string methodFromSecondInterface();
}

我想使用 mediatR 来处理这个查询。我可以做这样的事情吗?

public class QueryHandler : IRequestHandler<Query, IReadOnlyList<QueryResult>>
{
    //first handler 
    public IReadOnlyList<QueryResult> Handle(Query message)
    {
        //something
    }
    //second handler 
    public IReadOnlyList<QweReportModel> Handle(interfaceName1 message)
    {
        message.methodFromFirstInterface();
    }

    //third handler 
    public IReadOnlyList<QweReportModel> Handle(interfaceName2 message)
    {
        message.methodFromSecondInterface();
    }
}

是否可以通过 mediatR 发送查询来调用第二个或第三个处理程序,而不是第一个?

【问题讨论】:

  • 是什么阻止您使用三种不同的查询处理程序?这将尊重单一职责原则,并可直接与 MediatR 一起使用。
  • 我之前用过三个处理程序。我一直在寻找改进我的代码并使其更优雅的方法。我为此使用了一个处理程序和一个通用查询。

标签: c# ninject mediatr


【解决方案1】:

这是不可能的,请求按具体请求类型分派给处理程序。您必须为每个请求创建派生类型:

public class Query1 : Query, interfaceName1, IRequest<IReadOnlyList<QweReportModel>>
public class Query2 : Query, interfaceName2, IRequest<IReadOnlyList<QweReportModel>>

比你的处理程序看起来像:

public class QueryHandler : 
    IRequestHandler<Query, IReadOnlyList<QueryResult>>,
    IRequestHandler<Query1, IReadOnlyList<QweReportModel>>,
    IRequestHandler<Query2, IReadOnlyList<QweReportModel>>

和调度:

mediator.Send<IReadOnlyList<QweReportModel>>(new Query1());
mediator.Send<IReadOnlyList<QweReportModel>>(new Query2());

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 2020-01-24
    • 2019-12-21
    • 2020-12-08
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多