如何将数据验证与我的简单域对象(PO​​CO)分开?

Geo*_*uer 7 language-agnostic separation-of-concerns solid-principles modular-design

这个问题与语言无关,但我是C#家伙所以我使用术语POCO来表示一个只能预先形成数据存储的对象,通常使用getter和setter字段.

我只是将我的领域模型重新设计成超级PCOO,并且对于如何确保属性值在域中有意义而留下了一些问题.

例如,服务的EndDate不应超过服务所在合同的EndDate.但是,将检查放入Service.EndDate设置器似乎违反了SOLID,更不用说随着需要完成的验证数量增加,我的POCO类将变得混乱.

我有一些解决方案(将在答案中发布),但它们有其缺点,我想知道解决这一难题的最佳方法是什么?

Cha*_*tin 6

我认为你开始时有一个糟糕的假设,即你应该拥有除了存储数据之外什么都不做的对象,并且除了访问器之外没有任何方法.拥有对象的重点是封装数据和行为.如果你有一个东西,基本上是一个结构,你封装了什么行为?

  • 您描述的设计被称为"贫血领域模型".域驱动设计可以说是面向对象设计的一个特定应用,它规定了完全相反的情况,即对象应该封装它正在建模的数据和行为. (3认同)