前言
最近同事談到因為 Domain 物件的屬性設定為 private set ,
所以在測試專案中的測試程式要設定該屬性值時,
要透過 Reflection 方式來設定值。
不知大家是否也有類似的問題呢?
private set 的屬性,private 的 method …
討論
屬性會設定成 private set 表示只能在 Class 中設定值,
會這樣設計的原因是不想給外部的 class 來直接設定它。
所以這樣子的屬性值,通常在 constructor 時給值,
或是透過其他的 Public Method 來設定它的值,
以保證整個 Class 的商業邏輯屬性值是合法的。
所以在測試程式時,通常可以透過建立物件時來設定它的值,
或是透過它的 Public Method 來設定。
參考 abp 範例中的 Event Class
1 | public class Event : FullAuditedAggregateRoot<Guid> |
像上述的 Description
屬性,
可透過 Constructor 來設定值,或是透過 public 的 SetDescription
Method 來設定。
那這樣來看,不需要在測試程式中需要使用 Reflection 的方式來設定物件的屬性值。
所以要好好地檢視一下物件的設計,是否真的需要使用 private set ,
還是使用 internal set 就可以達到我們的目的呢?
例如透過同一個專案中的 Manager 來操作它們(請參考EventManager Class)
而那些 private Method ,是否也可以用 internal 呢?
還是其實應該會有一個 public method 可以來做這些事呢?