我正在使用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 { ... }
我可以使用此规则在执行命令和查询之前验证命令和查询(使用装饰器模式)。
我的问题是:如何从命令/查询处理程序向我的控制器返回“未找到”状态?
答案 0 :(得分:-1)
我建议你不要从命令中返回任何内容。如果您只是为了返回创建的ID的内容,那么您应该将ID传递给命令。这样您就不需要从命令中返回它。
这也表明您的数据存储策略正在渗透到您的设计中,并会随着时间的推移而增加复杂性。
关于从查询中返回'not found':我的偏好是返回0项或创建类似string.empty而不是单个项的null。但这只是偏好。虽然在项目中使用标准方法可能很方便。