Mat*_*att 4 asp.net-mvc domain-driven-design
我一直在研究使用服务层来验证我的域模型,然后再将它们保存到数据库中.
我找到了以下使用扩展方法来验证我的模型的例子,但是想知道这样做是否有任何特定的缺点?我没有看到提到的验证(除了数据注释).
我正在考虑实施以下内容:
public class FooService : IFooService {
public bool Add(Foo foo) {
if (!foo.IsValid()) {
return false
}
try ... catch
}
}
Run Code Online (Sandbox Code Playgroud)
public static class validationExtensions {
public static bool IsValid(this Foo foo) {
// Call my validation implementation here
}
}
Run Code Online (Sandbox Code Playgroud)
我很紧张,因为我没有看到这个建议/实施太多.思考?
Dmi*_*try 13
域对象应该是自我验证的,这是简单的OOP.不应该让他们首先进入无效状态.正确设计的域对象强制执行所有内部不变量,而不依赖于外部代码.否则封装会被破坏,你的对象实际上只是一个带有getter和setter的哑数据容器.
"验证"这个词也可能是一个非常危险的过度概括,它倾向于将焦点从域和对象转移到为UI框架选择而定制的哑数据容器.这就是DDD书籍根本没有提到"验证"问题的原因.我发现考虑不变量而不是验证更有用.不变量可以像" 社会安全号码不能有字母 " 一样简单,在这种情况下应该使用Value对象.或者更复杂,例如"如果订单在2周内没有付款则被认为是拖欠的 ",可以封装在order.IsDelinquent()类似的方法中.请注意,在第一种情况下,我们通过实现SocialSecurityNumber类消除了对象变为无效的可能性.在第二种情况下,我们使用无处不在的语言中的 "拖欠"一词而不是通用的"有效".请看到类似的答案:1,2,3.
作为旁注,您应该从ASP.NET人群中获取所有"DDD"建议.ASP.NET MVC是一个很好的框架,但学习资料将Domain模型与View模型混淆.大多数示例认为'domain'对象与具有getter和setter的数据容器相同,没有任何封装.DDD与技术无关,因此您可以随时通过问自己"在控制台应用程序中这是否有意义"来进行实际检查?或者"这会在非UI项目中有意义吗?".
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |