Vuk*_*oje 5 .net architecture domain-driven-design domain-model anemic-domain-model
通过Smart对象,如果属性被更改,我会考虑任何知道其原始属性值的Domain对象.智能对象通常具有基类,并通过使用GetPropertyValue/SetPropertyValue方法实现属性.另一方面,POCO对象通常没有基类并实现简单的属性.
public class SmartObject : BaseDomainObject
{
public int id
{
get { return (int)this.GetPropertyValue("Id"); }
set { this.SetPropertyValue("Id", value); }
}
}
public class POCO
{
public int id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我喜欢Smart对象,因为它为我做了很多艰苦的工作.我可以轻松地将所有这些有用的功能添加到BaseDomainObject中,并将它们放在我的所有派生域类中:
另一方面,POCO非常简单,不依赖于任何基类.
如今我在这里赞美了很多POCO因为:
另一方面,我认为上述原因是谬误,因为:
由于这一切都很难过,我仍然喜欢那个POCO而且它让我烦恼.你有什么意见?
- 常见属性(如 ID、状态...)
如果一个对象只是继承了定义 Id 属性的 Entity 基类,我不会认为它是非 POCO。根据定义,实体具有身份,该身份不会破坏 SRP,也不会通过导入第三方行为来改变对象的“纯度”。
状态更具争议性,具体取决于您的意思,它可能确实会在您的对象中引入额外的责任,使其成为非 POCO。
我认为您提到的大多数其他属性应该由外部对象处理,而不是域对象本身。
- 对象状态跟踪(新的、修改的、未更改的)
最好让域对象的更改跟踪专用代理来处理此问题(这通常是 ORM 所做的)。
- 所有属性都会引发属性更改事件(INotifyProperyChanged 的实现)
我认为这主要是与 UI 相关的东西,进入你的演示对象,而不是你的域对象。您可能不希望实体中的每个属性都是可观察的 - 要发出聚合中的更改信号,请改用领域事件。
- 我可以拥有所有其他有用的行为 - 克隆/同步/IsPropertyDirty...
克隆通常可以是值对象的基本行为,但它们不被视为非 POCO。除了您偶尔的特定领域需求之外,克隆实体对我来说似乎不太有用。Sync/IsPropertyDirty 再次看起来更像是版本控制/更改跟踪,应该委托给专门的对象。
这种对纯粹性的追求就像对更贫乏的领域模型的追求一样,它没有逻辑,也没有任何智能附加的东西。
这里的问题都是关于“附加”的。这并不是说符合 SRP 的对象不智能,而是它们不包含任何不属于其自然职责的智能内容。同样,POCO 并不愚蠢,它们只是没有从外部源(3d 方库、框架扩展...)移植行为的对象。