我一直在研究使用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
}
}
我很担心这样做,因为我没有看到这个推荐/实施的很多。想法?
答案 0 :(得分:13)
域对象应该是自我验证的,这是简单的OOP。不应该让他们首先进入无效状态。正确设计的域对象强制执行所有内部不变量,而不依赖于外部代码。否则,封装会被破坏,你的对象实际上只是一个带有getter和setter的哑数据容器。
“验证”这个词也可能是一个非常危险的过度概括,它倾向于将焦点从域和对象转移到为UI框架选择而定制的哑数据容器。这就是DDD book从未提及“验证”问题的原因。我觉得考虑不变比验证更有用。不变量可以像“社会安全号码不能有字母”一样简单,在这种情况下应使用Value object。或者更复杂的如“订单被认为是拖欠的,如果它未在2周内支付”,可以封装在order.IsDelinquent()
或类似的方法中。请注意,在第一种情况下,我们通过实现SocialSecurityNumber
类来消除对象变为无效的可能性。在第二种情况下,我们使用ubiquitous language中的“拖欠”一词,而不是通用的“有效”。请参阅类似的答案:1,2,3。
作为旁注,您应该从ASP.NET人群中获取所有“DDD”建议。 ASP.NET MVC是一个很好的框架,但学习资料将Domain模型与View模型混淆。大多数示例认为'domain'对象与具有getter和setter的数据容器相同,没有任何封装。 DDD是技术不可知的,所以你总是可以通过问自己“在控制台应用程序中这是否有意义”进行现实检查?或者“这会在非UI项目中有意义吗?”。