如何从命令处理程序(CQRS)返回未找到的状态

时间:2018-03-07 14:53:41

标签: c# cqrs

我正在使用ASP.NET Core,EF,Dapper(针对某些查询)和CQRS方法开发REST API。

我实施了这样的CQRS:

/* COMMANDS
 *******************************************/
public interface ICommand {}
public interface ICommand<out TResult> {}

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

public interface ICommandDispatcher
{
    Task Dispatch<TCommand>(TCommand command, CancellationToken cancellationToken) where TCommand : class, ICommand;

    Task<TResult> Dispatch<TCommand, TResult>(TCommand command, CancellationToken cancellationToken)
        where TCommand : class, ICommand<TResult>;
}

/* Queries
 *******************************************/
public interface IQuery<out TResult> { }

public interface IQueryHandler<in TQuery, TResult>
    where TQuery : IQuery<TResult>
{
    Task<TResult> Handle(TQuery query, CancellationToken cancellationToken = default(CancellationToken));
}

    public interface IQueryDispatcher
{
    Task<TResult> Dispatch<TQuery, TResult>(TQuery query,
        CancellationToken cancellationToken = default(CancellationToken)) where TQuery : class, IQuery<TResult>;
}

/* Rules
 *******************************************/
public interface IRules { }

我的实施很简单。我有查询,命令和命令与结果(可以返回已创建实体的ID)。我没有域对象,我没有实现DDD。业务规则包含在实现IRules接口的类中。例如:

public interface ILanguageRules : IRules
{
    bool IsLanguageCodeValid(string code);
    bool IsLanguageExists(string code);
}

public class LanguageRules: ILanguageRules { ... }

我可以使用此规则在执行命令和查询之前验证命令和查询(使用装饰器模式)。

我的问题是:如何从命令/查询处理程序向我的控制器返回“未找到”状态?

1 个答案:

答案 0 :(得分:-1)

我建议你不要从命令中返回任何内容。如果您只是为了返回创建的ID的内容,那么您应该将ID传递给命令。这样您就不需要从命令中返回它。

这也表明您的数据存储策略正在渗透到您的设计中,并会随着时间的推移而增加复杂性。

关于从查询中返回'not found':我的偏好是返回0项或创建类似string.empty而不是单个项的null。但这只是偏好。虽然在项目中使用标准方法可能很方便。