在为域设计模型时,它们几乎总是最终具有一些.IsSomething
功能。 IsNew
和IsDirty
通常用于数据持久性目的,IsValid
用于业务规则验证,甚至IsFraudulent
用于当前项目(更多业务规则验证)等。每当我看到这些由其他人实施,它们几乎总是以方法的形式完成。但我发现自己想知道是否有特殊原因。
我倾向于将属性描述为描述对象和方法以执行某种操作。这些并不是真正的行动。它们涉及代码,因为它们在被调用时是动态确定的,并且它们显然是只读的,但对我来说它们仍然适合作为属性而不是方法。
我想,可能存在属性的序列化问题。虽然丰富的域模型无论如何都不会很好地序列化,因为它包含逻辑和功能,所以每当我需要在服务边界上移动某些东西时,我通常首先将它扁平化为定义的DTO结构。
但我想知道其他人是否对这个问题有任何见解?有没有充分的理由将它们作为方法而不是属性来实现?
(切线相关,虽然an answer has already been given,扩展属性确实有助于这类内容的一致性。我有一些IsSomething()
扩展方法,通常在System.String
,用于实现域特定的逻辑。但即使属性是要走的路,我也可能希望坚持使用方法只是为了与扩展保持一致。)
答案 0 :(得分:6)
假设访问该属性:
然后我认为没有理由不将其作为财产。序列化不应成为问题 - 大多数序列化方案提供了将属性标记为瞬态(即不被序列化)的方法。
答案 1 :(得分:4)
我会使用属性,因为:
它以某种方式描述对象,从概念上描述其特征,其属性
它不要求任何参数
它基本上只是检索某些数据,而不执行任何独立的操作或修改