1

我们正在建立一个房地产门户网站。我们有服务、映射器和实体。在这个阶段,我们允许用户

  1. 通过表单创建属性。
  2. 上传包含 1 个或多个属性的批处理文件。

因此,如果他通过表单创建属性,我们可以验证表单,如果它是有效属性,我们可以将其添加到我们的系统中。但是如果他通过批处理文件上传,我们认为表单的责任是

  • 验证用户是否提供了文件
  • 文件类型有效
  • 并且文件大小在允许的范围内。

在此之后,它应该将文件移交给控制器或服务。

现在待处理的任务是

  • 处理文件并检索内容
  • 验证内容
  • 如果经过验证,请保存属性或显示错误。

那么哪些部分负责上述任务呢?

我认为控制器应该进行初始文件处理并将数据传递给服务。这意味着我们将在控制器中创建/获取表单对象并在控制器中验证表单。

现在下一部分是验证内容,这实际上是实体的集合。所以我们对这个阶段有以下想法

  1. 服务将验证数据并创建实体,并将它们保存。
  2. 或者服务将使用提供的数据创建实体,然后调用实体的验证函数。
  3. 或者服务将尝试使用提供的数据创建实体(将数据发送到实体构造函数),如果数据有效,则将创建实体或生成错误等。

我可以考虑上述方法的可能问题是

  • 如果服务正在验证数据,则意味着服务将知道实体的内部结构,因此如果以后我们需要更新实体结构,我们也必须更新服务。这将引入某种依赖。
  • 在第二种方法中,如果实体无效,我认为不应该首先创建实体。
  • 在第三种方法中,我们在实体的构造函数中创建了一个功能,因此使实体依赖于数据。所以当我们需要从持久化中获取实体时,我们需要提供一些存根数据。

还是我想多了??

4

2 回答 2

1

现在下一部分是验证内容,这实际上是实体的集合。

Controller发送给ServiceContents在最简单的情况下是对象图/结构/纯字符串,但绝不是业务实体的集合。

如果服务正在验证数据,则意味着服务将知道实体的内部结构

服务验证到底是什么?

服务正在验证数据意味着服务确保它接收到的每个结构/对象的不变性。

例如,如果F(T)是服务方法并且T是具有{ A, B, C }表示具有三个边的三角形的属性的结构,则服务必须确保不变量(每个站点的长度大于零并且任何两条边的长度之和必须大于比这个结构反序列化后这个结构的第三边的长度)。

必须进行此验证,因为反序列化程序不使用构造函数来确保反序列化期间的不变量。

完成这些验证后,传递给Service的所有对象都是有效的,可以直接在业务层中自由使用,也可以转换为业务层已知的对象(例如实体)。

如果以后我们需要更新实体结构,我们也必须更新服务。这将引入某种依赖。

这种依赖是不可避免的。由于传输对象实体对象是分开的,因此总是存在知道如何转换它们的映射器。

服务将验证数据并创建实体,并将它们保存。

我会和这个一起去的。服务验证数据,转换为业务层对象,调用业务层函数,持久化更改。

于 2016-08-01T12:09:24.910 回答
0

这取决于您要验证的约束类型。

1.参数验证,如 notEmpty 属性名称或最大长度等。

在这种情况下,您可以将验证逻辑提取到 Validator 对象。当您有多个属性创建表单(Web 表单,文件上传)时,这很有用,验证器可能被多个“客户端”调用,但验证逻辑保留在一个对象中。

2.业务规则验证。

我更喜欢使用域模型,您可以查看此演示文稿中的 PhoneNumber 示例

于 2013-10-12T01:25:31.467 回答