考慮,例如同一實體類型(任何ORM)的:不同版本的不同角色/授權級別
public interface IStaff
{
FullName name { get; set; }
EMailAddress email_address { get; set; }
SocialInsuranceId ssn { get; set; }
PositiveInt age { get; set; }
Address home_address { get; set; }
}
對於一些用戶來說,視圖模型將只需要name
和email_address
。 其他人可能有一個視圖模型,其中包含這些屬性加ssn
,age
和home_address
。比方說,還有一位統計師,他的觀點是age
和home_address
。
現在,我可以將它分解爲IStaffBasic
,IStaffDetails
和IStaffStats
,它具有接口繼承功能,可將給定視圖模型中的API限制爲適當的屬性。
但是,當通過線路從數據服務中檢索到此實體時,它仍將包含額外的詳細信息,但這些信息一定不會發生。
因此,這將是更好的
(A)創造完全不同的實體類型爲每個版本的,有些污染嚴重的服務層API,每種類型許多額外的近乎重複的查詢操作,或
(B )總是返回一個Staff
實體,但是(1)基於服務上的授權檢查並且(2)使用如上所述的視圖模型內的受限接口,或者( (C))將排除屬性設置爲null
的服務從服務中返回它們。使用我沒有考慮過的非常優雅的圖案或解決方案,但是關於哪些方面你會告訴我。
選項A在viewmodel級別看起來更清潔,但服務API會變得很糟糕。選項B似乎增加了服務器上實體處理的複雜性,但更好地遵守開放關閉原則。
想法?
感謝您的編輯 - 爲我闡明瞭它。 – Jay 2010-02-02 20:13:25