2012-01-03 72 views
1

我有一個高科技演示應用程序編寫,與多個客戶端:Web客戶端(ASP MVC 3),桌面客戶端(目前這將是一個WCF的應用程序,規劃香料它新城更高版本)和移動客戶端(WP7是默認的任務,但如果我覺得自己像一個時間百萬富翁,我可能會嘗試MonoDroid的太)我可以避免重複我的業務層嗎? (.NET)

我使用WCF爲客戶思考。
我在考慮使用EF Model First作爲後端。
但是,當我試圖弄清楚我在哪裏放置域邏輯(驗證,計算屬性等),而不必手動複製我已經在我的EF模型中聲明的所有內容時,就會出現問題。

我的第一個主要問題是EF有一個很好的內置對象跟蹤(obj.Components.Add(...); db.Save();),但是這個功能在客戶端很容易不可用。有沒有辦法實現我自己的方法呢? (我知道該怎麼做,但這對於這個演示來說太多了)

我的第二個主要問題(如標題所示)是域邏輯,主要是驗證。

  • 我是否應該將業務對象重新編譯到客戶端並將wcf序列化爲相同的對象?
  • 我應該嘗試在客戶端使用WCF生成的類嗎? (回到第一個問題)
  • 我應該嘗試使用共享程序集嗎?

  • 如果我將自己的邏輯寫入MVC控制器,我的WCF服務將無法對其進行整齊調用。

  • 如果我寫一個單獨的BusinessLayer應該也使用EF實體或我應該編寫自定義業務對象? (基本上是複製的一切再次)
  • 如果我使用EF實體,我一定要偏上的驗證,這是醜陋的(在這一點上,我應該切換到EF代碼第一?)
  • 有沒有一種好方法在客戶端使用這些相同的驗證?

  • 我是否應該廢棄整件事並嘗試RIA服務?

哦,這麼多的問題...

+0

我會使用普通的.net對象作爲域,然後添加與NHibernate或EF代碼優先的持久性。 – CodesInChaos 2012-01-03 10:51:38

+0

@CodeInChaos:這是我的同事向我暗示的:) – TDaver 2012-01-03 15:59:23

回答

3

我已經建立之前的跨平臺的應用程序在Windows上(特別是WPF/Silverlight客戶端,C#SQL服務器後端)和我做了什麼是這個。

  • 業跨越所有三個邊界工作的消息傳輸層或中間件(RabbitMQ的異步消息,或web服務爲請求/響應)和序列化技術(Protobuffers或JSON)。儘可能使用跨平臺中間件。這就是我提到RabbitMQ/protobuffers/JSON的原因。
  • 將所有業務邏輯移至服務器 - 客戶端根本無法訪問數據庫,必須通過中間件。客戶端(包括桌面)從字面上看就像訪問所有操作的中間件服務的瘦瀏覽器一樣。
  • 創建共享程序集來保存客戶端和服務器之間可以被所有客戶端和服務器引用的消息,數據合同和公共類。

最後一步(共享程序集)涉及創建1個與C#兼容的項目(適用於WPF桌面或服務器)以及每個Web客戶端(Silverlight,WP7)的其他項目。要在多個客戶端上雙重部署代碼,您需要在桌面組件中擁有一個源代碼副本,然後將相同的源文件「添加爲鏈接」添加到Silverlight/WP7程序集。你將不得不有幾個#if預處理器語句,但總的來說,可以使用這種方法來雙重部署大塊代碼。

你的籌碼變得

客戶:

所有客戶都有序列化,Web服務/中間件和MVVM/MVC模式的客戶端實現

中間件:

中間server/wpf桌面上的ware實現可以相同。 WP7和MonoDroid的等將需要不同

消息/ DataContracts:用我上面

服務器列出的技術

在所有客戶端/服務器的共享:

所有業務邏輯,數據庫訪問和服務器端中間件實現。對於數據庫訪問,我已經使用PetaPoco作爲一個出色的MicroORM。我相信一個microORM實現能夠支持堆棧溢出,但我可能弄錯了。

我也想看看this article的靈感。這是可能的 - 我用SL/WPF客戶端和C#服務器編寫客戶端/服務器應用程序,也使用上述方法編寫WPF客戶端/ Java服務器。

最好的問候,

+0

我會研究中間件層的附加優勢。我相信重新編譯的數據對象和JSON序列化,並且與EF Code First一起,我想我會管理。謝謝 – TDaver 2012-01-03 16:01:06

+0

Wcf本質上是中間件。無論哪種方式,通過抽象您的功能背後的Web服務,客戶端保持精簡和客戶端技術可以重新設計更容易 – 2012-01-03 19:55:56

+0

*「創建1個項目是完全C#兼容(所以適用於WPF桌面或服務器)和其他項目爲每個Web客戶端(Silverlight,WP7)「* - 你見過PortableLibrary的努力嗎? (http://blogs.msdn.com/b/bclteam/archive/2011/01/19/announcing-portable-library-tools-ctp-justin-van-patten.aspx) – MattDavey 2012-01-05 12:12:46

相關問題