使用 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.IQuery
1[[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 应该相当简单。
我尝试使用 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.IQueryHandler
2[[Domain.IQuery
1[[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 应该相当简单。