2010-07-22 95 views
0

嘿,我希望大家都做得很好。將EF Model暴露給各種客戶

我有(更多)一個廣泛的問題涉及將模型暴露給不同的客戶。

這是我的情況:我有一個使用EF 4.0和第三方Oracle提供程序創建的模型(位於Oracle之上)。該模型駐留在一個庫中,因此可以很容易地被多個項目引用。

我的目標是使通過多種類型的客戶的耗材型號爲可能的:

  1. .Net客戶端代碼(Silverlight的,WPF和ASP.Net,服務等)。
  2. MS Office應用程序(EXCEL)

現在,我並不想進入在模型中創建自定義方法的業務(例如GetCustomersWhoAreVeryUpsetOrderedByUpsetRank())。我希望能夠以客戶端代碼可以決定(在運行時)如何構建查詢的方式公開模型。我應該接受IQueriable,在服務中執行它並返回結果數據集?還是讓客戶通過模型完成所有工作?

我確實給了oData一個鏡頭,但似乎用來編寫Linq查詢的客戶端庫相當有限。另外該協議不支持更新。

所以我的問題是基於上述標準暴露模型的最佳方法/技術/實現是什麼?

非常感謝提前。

+1

oData就是爲此而設計的。你發現LINQ支持的「限制」是什麼?它確實支持更新 - 即使是事務和樂觀併發。 – 2010-07-22 17:56:48

+0

斯蒂芬 - 你是對的;數據是要走的道路 - 我早先對oData發表的評論道歉。在過去的10天裏,我做了相當多的研究,結論是它能很好地適應整個公司的體系結構。 – vajarov 2010-08-02 13:53:46

回答

1

我建議你不要與你的客戶1:1分享你的模型,或者爲不同的客戶1:1重複使用它。

要與干係人分享,請使用一些簡單的DTOs。映射代碼可以使用CASE工具,T4轉換或任何其他源代碼創建自動創建。如果您分享自己的模型,只要您需要/想要重構某些內容,或者如果某個客戶有某些特定需求,就會遇到問題。

幾乎相同取決於EF(DAL)的查詢方法。定義一些具有通用要求的接口並實現默認行爲。如果您需要使用GetCustomersWhoAreVeryUpsetOrderedByUpsetRank(),那麼您可以將此查詢添加到派生自默認映射器的數據映射器中,因此您表現得很好。採用這種方法,核心系統保持清晰和可重用,每個客戶端都能夠獲得她/他的自定義功能。