C# 如何组合这两个通用接口-ICommand和ICommand的命令处理程序<;TResult>;
在我的项目中,我有两种类型的命令:C# 如何组合这两个通用接口-ICommand和ICommand的命令处理程序<;TResult>;,c#,C#,在我的项目中,我有两种类型的命令: 没有结果的命令(ICommand) 带结果的命令(ICommand) 现在我有了这个命令处理程序: public interface ICommandHandler<in TCommand> where TCommand : class, ICommand { Task Handle(TCommand command, CancellationToken cancellationToken = default(CancellationT
- 没有结果的命令(ICommand)
- 带结果的命令(ICommand)
public interface ICommandHandler<in TCommand> where TCommand : class, ICommand {
Task Handle(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
}
public interface ICommandHandler<in TCommand, TResult> where TCommand : class, ICommand<TResult> {
Task<TResult> Handle(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
}
公共接口ICommandHandler,其中TCommand:class,ICommand{
任务句柄(TCommand命令,CancellationToken CancellationToken=default(CancellationToken));
}
公共接口ICommandHandler,其中TCommand:class,ICommand{
任务句柄(TCommand命令,CancellationToken CancellationToken=default(CancellationToken));
}
问题:是否可以为这两种类型的命令创建一个ICommandHandler接口?在回答之前-这里有一个问题:为什么需要一个接口来同时包含这两种命令?它们是两个不同的接口。如果将它们分开,则类可以实现一个、另一个或两者。如果您已经具备了这种灵活性,但没有将两个接口组合成一个接口,那么组合它们可能没有任何好处 这样想:一个类更可能只依赖于一个接口或另一个接口。它要么调用不返回结果的方法,要么调用返回结果的方法。(我不能肯定这一点,只是更可能是这样。)保持接口分离允许一个类只依赖于它所需要的接口,而不依赖于更多,这遵循了接口分离原则。即使类实现了两个接口,这也是正确的 组合也会变得有点混乱,因为如果希望在类级别声明所有泛型类型参数,那么实际上有三个泛型参数:
TCommand
,TResult
,还有一个表示ICommand
您可以使用继承,以便至少没有TResult
的处理程序保持独立:
public interface ICommandHandler<in TCommand>
where TCommand : class, ICommand
{
Task Execute(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
}
public interface ICommandHandler<in TCommand, TResult, in TCommandWithResult> : ICommandHandler<TCommand>
where TCommand : class, ICommand
where TCommandWithResult : ICommand<TResult>
{
Task<TResult> GetResult(TCommandWithResult command, CancellationToken cancellationToken = default(CancellationToken));
}
public interface ICombinedCommandHandler<in TCommand, TResult, in TCommandWithResult>
where TCommand : class, ICommand
where TCommandWithResult : ICommand<TResult>
{
Task Execute(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
Task<TResult> GetResult(TCommandWithResult command, CancellationToken cancellationToken = default(CancellationToken));
}
public interface ICommand { }
public interface ICommand<TResult> : ICommand { }
public interface ICommandHandler<in TCommand>
where TCommand : class, ICommand
{
Task Execute(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
}
public interface ICommandHandler<in TCommand, TResult> : ICommandHandler<TCommand>
where TCommand : class, ICommand<TResult>
{
Task<TResult> GetResult(TCommand command, CancellationToken cancellationToken = default(CancellationToken));
}