2010-02-02 43 views
1

考慮,例如同一實體類型(任何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; } 
} 

對於一些用戶來說,視圖模型將只需要nameemail_address。 其他人可能有一個視圖模型,其中包含這些屬性加ssn,agehome_address。比方說,還有一位統計師,他的觀點是agehome_address

現在,我可以將它分解爲IStaffBasic,IStaffDetailsIStaffStats,它具有接口繼承功能,可將給定視圖模型中的API限制爲適當的屬性。

但是,當通過線路從數據服務中檢索到此實體時,它仍將包含額外的詳細信息,但這些信息一定不會發生。

因此,這將是更好的
(A)創造完全不同的實體類型爲每個版本的,有些污染嚴重的服務層API,每種類型許多額外的近乎重複的查詢操作,或
(B )總是返回一個Staff實體,但是(1)基於服務上的授權檢查並且(2)使用如上所述的視圖模型內的受限接口,或者( (C))將排除屬性設置爲null的服務從服務中返回它們。使用我沒有考慮過的非常優雅的圖案或解決方案,但是關於哪些方面你會告訴我。

選項A在viewmodel級別看起來更清潔,但服務API會變得很糟糕。選項B似乎增加了服務器上實體處理的複雜性,但更好地遵守開放關閉原則。

想法?

回答

1

投影是要走的路 - 組合選項A和B.

你的ORM應該只用一個單一的實體類型,Staff互動,所以你只需要保持(伸)單套映射,查詢等等。

但是,您也將創建適合每個安全方案(IStaffBasicIStaffDetails等),項目Staff情況下,到這些不同的類別,並通過導線返回投影對象:

一些奧姆斯支持投影作爲框架功能,但如果需要,可以在服務層中手動完成。

+0

感謝您的編輯 - 爲我闡明瞭它。 – Jay 2010-02-02 20:13:25