我应该如何处理具有服务的 NotFound 404 而不仅仅是简单的存储库

How should I handle NotFound 404 having services and not only simple repositories

有关 Web API 和 return 的所有示例服务器上的资源状态如下所示:

var resource = repository.Get(id);
if(resource == null)
{
   return NotFound();
}
return resource;

这适用于最简单的架构。

但是有很多业务逻辑和服务调用该存储库,我不知道如何仍然可以使用这种方法。

在我们的架构中,每个 Web api 控制器都会注入一个服务,每个服务都会注入一个或多个存储库,甚至注入其他服务。

现在我的服务没有简单的获取方法return获取资源。

这些服务可能如下所示:

action(string materialNumber)
{
   var pdf = service.CreateProductPDF(materialNumber);
  return pdf;
}


class Service
{
   public XXX CreateProductPDF(string materialNumber)
   {
       // Do repository call here but HOW do I let the action know that the materialNumber does not exist?

       // Create product pdf from materialNumber


   }
}

我的问题在上面的评论里

您的域应该能够将 值对象 从存储库传输到服务。

值对象 可以称为 DomainResult,它应该包含您请求的域对象以及域验证信息(即 违反规则).

例如:

// It's an OVERSIMPLIFICATION, but it should give you the hint
// to keep you in the right track...
// This code requires C# 6 as it's using expression-bodied properties!
public class DomainResult<TResult>
{
    public TResult Result { get; set; }
    public List<BrokenRule> BrokenRules { get; } = new List<BrokenRule>();
    public bool IsSuccessful => BrokenRules.Count == 0;
} 

例如,您的方法可能如下所示:

class Service
{
   public DomainResult<PdfDocument> CreateProductPDF(string materialNumber)
   {
       DomainResult<PdfDocument> result = repo...;

       // result object might contain a BrokenRule containing a code/message
       // "Product couldn't be created because materialNumber wasn't found"

       return result;
   }
}

然后您可以 return 在您的 Web API 资源方法中 return 一个 404 取决于在域事务期间违反了哪些规则。此外,您应该在 API 控制器中使用 ModelState.AddModelError 将这些违反规则的消息添加到 ModelState