Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何组合这两个通用接口-ICommand和ICommand的命令处理程序<;TResult>;_C# - Fatal编程技术网

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));
}