使用扩展方法验证域模型

时间:2012-02-21 17:18:25

标签: asp.net-mvc domain-driven-design

我一直在研究使用service layer来验证我的域模型,然后再将它们保存到数据库中。

我发现following example使用扩展方法来验证我的模型,但是想知道这样做是否有任何特定的缺点?我没有看到提到的验证(除了数据注释)。

我正在考虑实施以下内容:

public class FooService : IFooService {

    public bool Add(Foo foo) {

        if (!foo.IsValid()) {
            return false
        }

        try ... catch
    }
}

public static class validationExtensions {

    public static bool IsValid(this Foo foo) {

        // Call my validation implementation here
    }
}

我很担心这样做,因为我没有看到这个推荐/实施的很多。想法?

1 个答案:

答案 0 :(得分:13)

域对象应该是自我验证的,这是简单的OOP。不应该让他们首先进入无效状态。正确设计的域对象强制执行所有内部不变量,而不依赖于外部代码。否则,封装会被破坏,你的对象实际上只是一个带有getter和setter的哑数据容器。

“验证”这个词也可能是一个非常危险的过度概括,它倾向于将焦点从域和对象转移到为UI框架选择而定制的哑数据容器。这就是DDD book从未提及“验证”问题的原因。我觉得考虑不变比验证更有用。不变量可以像“社会安全号码不能有字母”一样简单,在这种情况下应使用Value object。或者更复杂的如“订单被认为是拖欠的,如果它未在2周内支付”,可以封装在order.IsDelinquent()或类似的方法中。请注意,在第一种情况下,我们通过实现SocialSecurityNumber类来消除对象变为无效的可能性。在第二种情况下,我们使用ubiquitous language中的“拖欠”一词,而不是通用的“有效”。请参阅类似的答案:123

作为旁注,您应该从ASP.NET人群中获取所有“DDD”建议。 ASP.NET MVC是一个很好的框架,但学习资料将Domain模型与View模型混淆。大多数示例认为'domain'对象与具有getter和setter的数据容器相同,没有任何封装。 DDD是技术不可知的,所以你总是可以通过问自己“在控制台应用程序中这是否有意义”进行现实检查?或者“这会在非UI项目中有意义吗?”。