gpt4 book ai didi

C#泛型/ICommandHandler/ICommand设计

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:34 25 4
gpt4 key购买 nike

我必须设计一个 Command/CommandHandler 模块,并且正在努力处理设计的细节。

我创建了一个(空的)接口(interface):

public interface ICommand {}

由各种命令实现,

例如

public interface TestCommand : ICommand {}

一个(或多个)CommandHandlers 可以注册一个特定的实现 ICommand .为了避免持续转换,我构建了一个接口(interface):

public interface ICommandHandler<in TCommand>
where TCommand : ICommand
{
void Handle(TCommand command);
}

到目前为止一切顺利......命令调度系统是麻烦的事情:命令处理程序应该由 Autofac(或任何其他 DI 系统)注入(inject),例如:

public CommandDispatcher (IEnumerable<ICommandHandler<ICommand>> commandHandlers)

如您所见,这是不可能的。 ICommandHandler<CommandType1>ICommandHandler<CommandType2>不是来自 ICommandHandler<ICommand>因此不能放入同一个 IEnumerable。

关于如何以无问题的方式设计它有什么建议吗?

最佳答案

通常您会在调用它们之前解决它们。例如,在 Autofac

class CommandDispatcher
{
private readonly Autofac.IComponentContext context; // inject this

public void Dispatch<TCommand>(TCommand command)
{
var handlers = context.Resolve<IEnumerable<ICommandHandler<TCommand>>>();
foreach (var handler in handlers)
{
handler.Handle(command);
}
}

public void ReflectionDispatch(ICommand command)
{
Action<CommandDispatcher, ICommand> action = BuildAction(command.GetType());
// see link below for an idea of how to implement BuildAction

action(this, command);
}
}

如果需要将方法签名更改为Dispatch(ICommand command),请参阅this answer .您应该能够根据自己的情况进行调整。

关于C#泛型/ICommandHandler/ICommand设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16820038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com