【发布时间】:2019-09-13 06:54:06
【问题描述】:
我正在使用 cqs,我正在尝试在类库中实现它(因此没有 IOC、IServiceProvider 等)。这是我写的一些代码:
public interface IQuery<TResult>
{
}
public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
public class Query : IQuery<bool>
{
public int Value { get; set; }
}
public class QueryHandler : IQueryHandler<Query, bool>
{
public bool Handle(Query query)
{
return query.Value > 0;
}
}
public class Dispatcher
{
private readonly Dictionary<Type, object> handlers = new Dictionary<Type, object>();
public Dispatcher()
{
handlers.Add(typeof(Query), new QueryHandler());
}
public T Dispatch<T>(IQuery<T> query)
{
IQueryHandler<IQuery<T>, T> queryHandler;
if (!this.handlers.TryGetValue(query.GetType(), out object handler) ||
((queryHandler = handler as IQueryHandler<IQuery<T>, T>) == null))
{
throw new Exception();
}
return queryHandler.Handle(query);
}
}
这就是我如何调用我的代码:
Query query = new Query();
Dispatcher dispatcher = new Dispatcher();
var result = dispatcher.Dispatch(query);
但是问题是在dispatcher里面,我不知道为什么变量handler不能被强制转换为IQueryHandler<IQuery<T>,T>。这是一些额外的数据:
PS:我知道如何使这项工作(动态),但我想了解为什么此代码不起作用。
【问题讨论】:
-
这是哪个版本的 C# 和运行时?它已经支持
out了吗? -
.net 框架 4.7