【问题标题】:Finding handler for query in QueryBus with Castle Windsor使用 Castle Windsor 在 QueryBus 中查找查询处理程序
【发布时间】:2018-09-07 08:17:01
【问题描述】:

我尝试使用 CQRS 创建应用程序并实现 QueryBus。有我的查询:通用查询和一个带有处理程序的特定查询

public interface IQuery<TResult> { }

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Execute(TQuery query);
}

public class PeriodPlanListQuery : IQuery<object> { }

public class PeriodPlanListQueryHandler : IQueryHandler<PeriodPlanListQuery, object>
{
    public object Execute(PeriodPlanListQuery query)
    {
        return new { };
    }
}

我使用温莎城堡来解决依赖关系

        container.Register(
            Component.For<IQueryHandler<PeriodPlanListQuery, object>>()
                .ImplementedBy<PeriodPlanListQueryHandler>()
                .LifestylePerWebRequest());

在我的 QueryBus 方法的实现中

    public TResult Send<TResult>(IQuery<TResult> query)
    {
        var handler = _container.Resolve<IQueryHandler<IQuery<TResult>, TResult>>();
        if (handler == null)
            throw new NotSupportedException(query.GetType().FullName);

        var result = handler.Execute(query);
        return result;
    }

我得到错误缺少组件,我的问题是我的 QueryBus 实现或在组件中注册有什么问题

没有支持服务的组件 Domain.IQueryHandler2[[Domain.IQuery1[[System.Object, mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089]],JP.Planner.Domain,版本=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Object, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]] 找到了

【问题讨论】:

  • blog post 中给出了您问题的答案。看一下QueryProcessor 的实现以及它为何以这种方式实现的描述。

标签: c# generics castle-windsor cqrs


【解决方案1】:

看起来PeriodPlanListQueryHandler 已注册以公开IQueryHandler&lt;PeriodPlanListQuery, object&gt;,但您正在尝试解析IQueryHandler&lt;IQuery&lt;object&gt;, object&gt;

两端需要完全匹配才能正常工作。

目前您的模型无法工作,因此可能需要重新调整。我建议暂时忘记 Windsor,并尝试使用没有库的纯 C# 来解决它。

当前代码正在有效地尝试做:

IQueryHandler<IQuery<object>, object> h = new PeriodPlanListQueryHandler();

这不是有效的 C# 并且不会编译,这也是您的 Windsor 配置无法按预期工作的原因。

尝试找出在 Windsor 之外满足您需求的模型,然后为该模型配置 Windsor 应该相当简单。

【讨论】:

  • 我应该如何更改 QueryBus 中的解析器以保持通用注入?
  • 这取决于您的应用程序的上下文。我用一些额外的指针更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多