使用 Castle Windsor 在 QueryBus 中查找查询处理程序

Finding handler for query in QueryBus with Castle Windsor

我尝试使用 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 或注册有什么问题

No component for supporting the service Domain.IQueryHandler2[[Domain.IQuery1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], JP.Planner.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] was found

PeriodPlanListQueryHandler 似乎已注册公开 IQueryHandler<PeriodPlanListQuery, object>,但您正在尝试解析 IQueryHandler<IQuery<object>, object>

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

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

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

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

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

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