我需要设计一个命令/命令处理模块,但是在设计细节上遇到了困难。
我已经创建了一个(空的)接口:
public interface ICommand {}
这是由各种命令实现的,例如:
public interface TestCommand : ICommand {}
一个或多个 CommandHandlers 可以注册到特定的 ICommand 实现中。为了避免频繁强制类型转换,我已经建立了一个接口:
public interface ICommandHandler<in TCommand>
where TCommand : ICommand
{
void Handle(TCommand command);
}
目前为止一切都很好……问题出在命令分发系统上:命令处理程序应该由Autofac(或任何其他DI系统)注入,例如:
public CommandDispatcher (IEnumerable<ICommandHandler<ICommand>> commandHandlers)
如您所见,这是不可能的。`ICommandHandler`和`ICommandHandler`都没有从`ICommandHandler`继承,因此不能放入同一个IEnumerable中。
有什么建议可以以非问题方式设计它吗?
ICommandDispatcher
,然后仅在组合根处创建一个AutofacCommandDispatcher
,但我认为这是不必要的间接性 - 如果您切换DI容器,则需要相同数量的工作;唯一的优点是如果您不想在“业务逻辑”程序集中引用Autofac DLL。 - default.kramer