Nat*_*ate 6 .net c# class-design
我正在构建一个基本的CRUD库,我期望在本地(添加引用)和wcf(添加服务引用)环境中使用它.
CRUD设置的Create,Uupdate和Delete部分(具有更复杂的业务规则)的最佳返回类型是什么?
我希望能够最大限度地减少线路上的来回,但我也希望为我的客户提供有关何时操作失败我的业务逻辑但在技术上有效的有意义的信息(因此它不是例外).
举个例子,CRUD用于Person类,它包含以下字段:FirstName,MiddleName LastName和Brith的Date.首先,最后和DOB是必需的,但中间则不是.
我应该如何将业务逻辑的失败传达给客户?IE"您必须为FirstName指定一个值."
1.这是我应该抛出异常的地方吗?(感觉不是一个例外,所以我认为不是,但我可能是错的)。
就我个人而言,我认为您应该返回一个带有结果以及任何验证错误的对象,而不是抛出数据验证异常,无论是由于缺少信息(格式验证)还是业务逻辑验证。但是,我确实建议对与数据本身无关的错误抛出异常 - 即:如果数据库提交因有效数据而失败等。
我的想法是,验证失败并不是“异常现象”。我个人认为,用户因未输入足够/正确/等数据而可能搞砸的任何事情都不是例外 - 这是标准做法,应该由 API 直接处理。
与用户正在执行的操作无关的事情(即:网络问题、服务器问题等)是异常事件,并且需要例外。
2.我应该使用void和“out”参数吗?如果是的话,应该是什么类型?
3.我应该使用对象返回类型并将发生的情况的数据放入其中吗?
我个人更喜欢第三种选择。“out”参数没有多大意义。此外,您将希望从此调用返回多个状态信息 - 您将希望返回足够的信息以将适当的属性标记为无效,以及任何完整的操作范围信息。
这可能需要一个类,该类至少包含提交状态(成功/失败的格式/失败的业务逻辑/等)、属性->错误的映射列表(即:IDataErrorInfo样式信息),以及潜在的与特定属性无关的错误列表,而是处理整个操作的业务逻辑或建议属性值的组合。
4.还有一些我完全错过的选择吗?
我非常喜欢的另一个选项是在业务处理层的单独程序集中进行验证。这允许您在客户端重用验证逻辑。
这样做的好处是您可以大大简化和减少网络流量。客户端可以预先验证信息,并且仅在有效的情况下通过网络发送数据。
服务器可以接收良好的数据,并重新验证它,并且只返回单个提交结果。我确实相信这应该至少有三个响应 - 成功、由于业务逻辑而失败或由于格式化而失败。这提供了安全性(您不必信任客户端),并向客户端提供有关未正确处理的内容的信息,但避免从客户端->服务器传递错误信息以及从服务器->客户端传递验证信息,因此可以大大减少流量。
然后,验证层可以(安全地)将信息发送到 CRUD 层进行提交。
| 归档时间: |
|
| 查看次数: |
1551 次 |
| 最近记录: |