17

我确信我不是唯一一个面临这个问题的人,但直到现在我都无法找到解决方案。问题如下。

我已经从旧系统发布了一个 Web 服务(我没有任何控制权,也无法更改它),并且所有客户端都在使用它。我收到来自 Web 服务的请求,而我得到的对象是一个非常复杂的请求,但为了举例,假设我从 Web 服务调用中接收到对象 A,其中包含其他几个对象,如对象 B、对象 C 等此外,对象 B 和 C 也有一些原始数据类型以及其中的一些其他对象。我的问题是我想验证整个对象 A(所有包括对象和子对象),这里推荐哪种设计模式?其次,这里的重点是我可以从 Web 服务中获取不同类型的 Object A。我所说的不同类型的对象 A 的真正意思是对象 A 取决于客户端,即 一些客户端将发送对象 A 而不将数据填充到包含对象 B 中,甚至他们可以部分填充对象 B,然后将其发送到对象 A。所以我必须根据客户端验证对象 A(因为某些客户端需要包含对象 B 有些不需要,有些需要对象 B 中的少量元素等)。所以换句话说,我将有一个地方存储每个客户端的验证规则,这将告诉我客户端 ABC 希望对象 B 中的字段 abc 为字符串类型,最大长度为 25 个字符,它必须在该字段中有数据。所以我必须根据客户端验证对象 A(因为有些客户端需要包含对象 B,有些则不需要,有些需要对象 B 中的少量元素等)。所以换句话说,我将有一个地方存储每个客户端的验证规则,这将告诉我客户端 ABC 希望对象 B 中的字段 abc 为字符串类型,最大长度为 25 个字符,它必须在该字段中有数据。所以我必须根据客户端验证对象 A(因为有些客户端需要包含对象 B,有些则不需要,有些需要对象 B 中的少量元素等)。所以换句话说,我将有一个地方存储每个客户端的验证规则,这将告诉我客户端 ABC 希望对象 B 中的字段 abc 为字符串类型,最大长度为 25 个字符,它必须在该字段中有数据。

我想要执行的一些验证是

检查某些对象(例如对象 B)的字段的数据类型、特定字段的长度、是此客户端所需的字段还是可选的字段等...

任何具体的工作示例都将非常有用。

此特定示例的对象 A 的结构如下。

    public class A
    {
        private B objectB;
        private C objectC;
        // and so on
    }

    public class B{
        private E objectE;
        private String name;
        private int age;
        // and so on
    } 

    public class C
    {
        private F objectF;
        private String address;
        private String country;
    }

    public class E
    {
        // Members here
    }

    public class F
    {
        // Members here
    }

PS:我给类和成员起了任意的名字,只是为了一般的理解。哦,是的,我忘了提到我在这里使用的是 java,但这并不重要,因为设计原则或模式可以应用于任何语言。希望尽快收到你们的来信.. :)

4

2 回答 2

7

验证是一个交叉问题。有几种方法和几种设计模式可以实现。

在 Asp.net 中,它是通过属性完成的,在 Java Spring 中,它是通过 Annotations 完成的,以保持代码干净、可读和可维护。

您可以找到大量不同的方法,您需要记住的是这些框架遵循的方法。即代码维护、可读性和干净的代码。

没有银弹。您甚至可以在代码中编写验证。

于 2013-08-19T16:16:51.980 回答
0

每个类都应该知道如何验证自己。您可以从具有 .Validate() 方法的接口(例如 IValidatable)派生每个类。当您在对象 A 上调用 .Validate() 时,让它自己验证,然后在所有子对象上调用 .Validate()。这些孩子可以以类似的方式验证自己。

我认为这是命令模式的一个非常简单的版本。有点。

您还可以编写一个可以附加到您的班级的验证器。验证器可以知道如何验证电子邮件地址、常规地址等。这更具可扩展性,因为您基本上是在创建一个工具箱来附加到您的类中,该工具箱只包含它需要的工具。

于 2013-08-19T16:07:38.577 回答