C# 存储库应该返回到RESTfulWebAPI的错误代码是什么

C# 存储库应该返回到RESTfulWebAPI的错误代码是什么,c#,entity-framework,repository-pattern,C#,Entity Framework,Repository Pattern,当我看微软关于存储库模式的示例时,它当然是一个完全简单的示例,与现实世界的需求无关-一如既往- 存储库Add/Del/Update方法返回Void-nothing- 另一方面,当有人使用我的RESTfulWebAPI时,我想提供如下内容 NotFound()如果删除记录没有任何作用 OK()如果删除成功 更新方法也是如此 您在实际项目中使用什么作为存储库的返回类型,以让调用方知道真正发生了什么?有两个主要选项: 将NotFound这样的情况视为例外情况。指定在您要删除的对象不存在的情况下存储库

当我看微软关于存储库模式的示例时,它当然是一个完全简单的示例,与现实世界的需求无关-一如既往-

存储库Add/Del/Update方法返回Void-nothing-

另一方面,当有人使用我的RESTfulWebAPI时,我想提供如下内容

NotFound()
如果删除记录没有任何作用

OK()
如果删除成功

更新方法也是如此


您在实际项目中使用什么作为存储库的返回类型,以让调用方知道真正发生了什么?

有两个主要选项:

  • 将NotFound这样的情况视为例外情况。指定在您要删除的对象不存在的情况下存储库将引发的异常类型。如果您选择此选项,那么您可以在Web API层拥有一个非常通用的异常捕获处理程序,该处理程序知道这些异常应该转换为什么样的响应
  • 更改存储库接口以返回一个错误值或一个表示调用该方法的所有可能结果的值。这需要调用存储库的方法来决定在每个场景中要做什么,但它也允许更灵活地处理场景。(例如,如果人员本身不在,您可能希望
    DeletePerson
    返回NotFound,但如果在使用不同的存储库清理某些相关数据时没有数据,您希望使用不同的返回类型?)
  • 您应该避免让存储库层返回某种面向HTTP的响应代码

    在现实世界的项目中,您使用什么作为存储库的返回类型来让调用方知道真正发生了什么

    “结果对象”。简单的版本可能如下所示:

    public class RepositoryActionResult
    {
        public int RecordsAffected { get; set; }        
    }
    
    然后,您可以从存储库方法中进行设置,并适当地处理调用代码的结果,而无需对控制流使用异常


    您可以根据自己的需求使这个类变得复杂

    如果您问我,RecordsAffected在存储库之外没有用处。如果每行更新3个表,SaveChanges将返回3。更新可能仍然是错误的。我已经这样做了:int-recordsafected=context.SaveChanges()我不喜欢用它来计算表数。。。在错误情况下返回insert实体或null。我最喜欢的第一种方法是将NotFound视为例外。因此,我将创建一个NotFoundException类,并将其与NotFoundExceptionFilterAttribute连接:-)谢谢@伊莉莎:在这种情况下,你可能需要考虑的另一件事是提供一种不抛出异常的方法——也许是<代码> TyDeleTeEe()/Cuth>方法,它返回布尔值,或者如果该项不存在,则不做任何事情。您可能会遇到这样的情况:您不在乎该内容是否已被删除,我不建议在这些情况下捕获和删除异常。顺便说一句。在没有例外的情况下,你会返回什么?无效的对于Create,我必须返回实体-因为新创建的Id-但是对于update/delete/ATTACH/DETACH?最后两个只是一个关系删除实际上是一种HTTP修补程序。@Elisa:是的,如果你想说由于某种原因不起作用的操作都由异常表示,那么你的实际返回类型应该与你不关心这些异常时的返回类型相同。