- Command是一个简单的数据传输对象(DTO),描述应该发生的事情。例如:“将计数器增加5”。 - CommandHandler能够处理特定类型的Command。 - CommandBus获取一个Command并执行能够处理它的CommandHandler。
我编写的代码无法编译。
编译器报错“无法从'IncrementHandler'转换为'Handler<Command>'”。我不明白为什么,因为IncrementHandler实现了Handler<Increment>,而Increment实现了Command。
我尝试在泛型接口上使用in和out修饰符,但这并不能解决问题。
有没有只使用接口就能实现这个功能的方法?
[TestClass]
public class CommandBusTest
{
[TestMethod]
public void DispatchesProperly()
{
var handler = new IncrementHandler(counter: 0);
var bus = new CommandBus(handler); // <--Doesn't compile: cannot convert from 'IncrementHandler' to 'Handler<Command>'
bus.Dispatch(new Increment(5));
Assert.AreEqual(5, handler.Counter);
}
}
public class CommandBus
{
private readonly Dictionary<Type, Handler<Command>> handlers;
public CommandBus(params Handler<Command>[] handlers)
{
this.handlers = handlers.ToDictionary(
h => h.HandledCommand,
h => h);
}
public void Dispatch(Command commande) { /*...*/ }
}
public interface Command { }
public interface Handler<TCommand> where TCommand : Command
{
Type HandledCommand { get; }
void Handle(TCommand command);
}
public class Increment : Command
{
public Increment(int value) { Value = value; }
public int Value { get; }
}
public class IncrementHandler : Handler<Increment>
{
// Handler<Increment>
public Type HandledCommand => typeof(Increment);
public void Handle(Increment command)
{
Counter += command.Value;
}
// Handler<Increment>
public int Counter { get; private set; }
public IncrementHandler(int counter)
{
Counter = counter;
}
}
params
,因为我想要能够传递任意数量的处理程序,就像这样:new CommandBus(new AHander(), new BHandler(), new CHandler())
。 该总线将包含多个处理程序,因为会有多种类型的命令。 - Christophe Cadilhacparams
语法没问题,它将出现在构造函数中的Handler<Command>[]
中,并且只有一个条目。 - Cee McSharpfaceHandler<TCommand>
的定义,您只能将其逆变为TCommand
,但是这样IncrementHandler
就与Handler<Command>
不兼容,因为Command
是Increment
的超类型而不是所需的子类型。没有安全的方法可以解决这个问题,所以您必须在某个地方进行转换。 - Lee