【问题标题】:What kind of error codes should a repository return to a RESTful Web API存储库应该向 RESTful Web API 返回什么样的错误代码
【发布时间】:2015-06-24 18:18:00
【问题描述】:

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

http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

Repository Add/Del/Update 方法返回 Void - nothing -

另一方面,当有人使用我的 RESTful Web API 时,我想提供类似的东西

NotFound()如果删除记录没有做任何事情

OK()如果删除成功

更新方法也一样。

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

【问题讨论】:

    标签: c# entity-framework repository-pattern


    【解决方案1】:

    有两个主要选项:

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

    您应该避免的是让存储库层返回某种面向 HTTP 的响应代码。

    【讨论】:

    • 我最喜欢你的第一种方法,因为它认为 NotFound 是例外的。因此,我将创建一个 NotFoundException 类并将其与 NotFoundExceptionFilterAttribute 连接起来 :-) 谢谢!
    • @Elisa:在这种情况下,您可能还需要考虑的另一件事是提供一种不引发异常的方法——也许是一个 TryDelete() 方法,它要么返回一个布尔值或者如果该项目不存在,则根本不执行任何操作。您可能会遇到不关心事物是否已被删除的情况,我不建议在这些情况下捕获和食用异常。
    • 顺便说一句。你在没有例外的地方返回什么?空白?对于 Create 我必须返回实体 - 因为新创建的 Id - 但对于 update/delete/ATTACH/DETACH ?最后两个只是关系删除,实际上是一种 HTTP 补丁。
    • @Elisa:是的,如果您要说由于某种原因不起作用的操作都由异常表示,那么您的实际返回类型应该与如果你不在乎那些例外。
    【解决方案2】:

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

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

    public class RepositoryActionResult
    {
        public int RecordsAffected { get; set; }        
    }
    

    然后您可以从您的存储库方法中设置它并适当地处理调用代码的结果,而不使用控制流异常。

    您可以根据自己的要求使这个类变得尽可能复杂。

    【讨论】:

    • 如果您问我,RecordsAffected 在存储库之外没有用。如果每行更新 3 个表,则 SaveChanges 返回 3。更新可能仍然是错误的。我已经这样了: int recordsAffected = context.SaveChanges() 我不喜欢它来计算表...返回插入实体或在错误情况下为 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多