2

当我为一个领域设计模型时,它们几乎总是最终具有一些.IsSomething功能。 IsNew并且IsDirty对于数据持久性目的,IsValid业务规则验证,甚至IsFraudulent在当前项目(更多业务规则验证)等方面都很常见。每当我看到其他人实现这些时,它们几乎总是作为方法来完成。但我发现自己想知道是否有特定的原因。

我倾向于将属性视为描述对象,将方法视为执行某种操作。这些并没有真正执行操作。它们涉及代码,因为它们在调用时是动态确定的,而且它们显然是只读的,但对我来说,它们仍然适合作为属性而不是方法。

我想,属性可能存在序列化问题。尽管富域模型由于包含逻辑和功能而往往不能很好地序列化,但每当我需要跨服务边界移动某些东西时,我通常首先将其扁平化为定义的 DTO 结构。

但我想知道是否有人对这个主题有任何见解?是否有充分的理由将这些实现为方法而不是属性?

(切线相关,虽然已经给出了答案,但扩展属性确实有助于保持这样的一致性。我有许多IsSomething()扩展方法,通常是 on System.String,用于实现特定于域的逻辑。但即使属性是去吧,我可能想坚持使用方法只是为了与扩展保持一致。)

4

2 回答 2

6

假设访问该属性:

  • 没有副作用
  • 是“相当快”(是的,非常毛茸茸的......)

那么我认为没有理由不将其作为财产。序列化不应该成为问题——大多数序列化方案都提供了将属性标记为瞬态(即不可序列化)的方法。

于 2010-12-13T14:07:06.893 回答
4

我会使用一个属性,因为:

  1. 它以某种方式描述对象,因此从概念上讲它的特征,它的属性

  2. 它不要求任何参数

  3. 它基本上只是检索某些数据,不执行任何独立的操作或修改

于 2010-12-13T14:07:41.993 回答