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

时间:2015-09-23 07:56:23

标签: c# http asp.net-web-api architecture asp.net-web-api2

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

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

这适用于最简单的架构。

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

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

现在我的服务没有简单的Get方法返回资源。

这些服务可能如下所示:

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


   }
}

我的问题在上面的评论中。

1 个答案:

答案 0 :(得分:0)

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

值对象可以被称为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;
   }
}

然后,您可以在Web API资源方法中返回404,具体取决于域事务期间哪些规则已被破坏。此外,您应该使用API​​控制器中的ModelState将这些损坏的规则消息添加到ModelState.AddModelError