Model.Is ___ - 它应该是属性还是方法?

时间:2010-12-13 14:03:22

标签: c# domain-model

在为域设计模型时,它们几乎总是最终具有一些.IsSomething功能。 IsNewIsDirty通常用于数据持久性目的,IsValid用于业务规则验证,甚至IsFraudulent用于当前项目(更多业务规则验证)等。每当我看到这些由其他人实施,它们几乎总是以方法的形式完成。但我发现自己想知道是否有特殊原因。

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

我想,可能存在属性的序列化问题。虽然丰富的域模型无论如何都不会很好地序列化,因为它包含逻辑和功能,所以每当我需要在服务边界上移动某些东西时,我通常首先将它扁平化为定义的DTO结构。

但我想知道其他人是否对这个问题有任何见解?有没有充分的理由将它们作为方法而不是属性来实现?

(切线相关,虽然an answer has already been given,扩展属性确实有助于这类内容的一致性。我有一些IsSomething()扩展方法,通常在System.String,用于实现域特定的逻辑。但即使属性是要走的路,我也可能希望坚持使用方法只是为了与扩展保持一致。)

2 个答案:

答案 0 :(得分:6)

假设访问该属性:

  • 没有副作用
  • “合理快速”(是的,非常羊毛......)

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

答案 1 :(得分:4)

我会使用属性,因为:

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

  2. 它不要求任何参数

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