【问题标题】:How should I handle NotFound 404 having services and not only simple repositories我应该如何处理 NotFound 404 具有服务而不仅仅是简单的存储库
【发布时间】:2015-09-23 18:14:28
【问题描述】:

所有关于 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


   }
}

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

【问题讨论】:

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


    【解决方案1】:

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

    值对象可以称为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.AddModelError 将这些损坏的规则消息添加到 ModelState

    【讨论】:

    • @Elisabeth BTW HTTP 响应是不可能的,无法返回状态码:D
    • 我的服务层与 http 无关,因此不应与 http 耦合。
    • @Elisabeth 如果您的服务是使用 ASP.NET Web API 开发的,那么它如何与 HTTP 无关???????????
    • 该服务可以在非 Http 环境中使用。对于服务,我的意思是 productService.cs 不是 Web 服务的抽象事物服务。
    • 好的,所以 Repository/Service/endpoint 都共享 DomainResult 对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2017-10-11
    • 2013-03-16
    • 2010-12-06
    • 2017-10-26
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多