2009-10-28 28 views
0

我已經閱讀了一些關於創建無狀態網站的書籍,我已經閱讀了一些關於有狀態客戶端應用程序的內容,但是當你必須將兩者結合起來時,會出現很多複雜性。我們有一個Flex應用程序需要通過.NET服務將數據保存到數據庫。需要注意的是: - 併發(樂觀/悲觀) - 性能:Flex需要加載大量數據,因此經常需要延遲加載。 - 您是否使用Dto在服務器和客戶端之間傳輸數據?如何解決客戶端 - 服務器應用程序中的狀態無狀態?

我會告訴你我們產品的歷史。我們從一開始就使用SubSonic作爲o/r映射器。 SubSonic對象轉換爲我們寫的dto,這些dto被轉移到客戶端。客戶端的dto被轉換爲域模型。如果客戶端需要保存域模型對象,則將其轉換回dto併發送到服務器。服務器端將dto轉換爲亞音速對象並保存到數據庫。

現在,前段時間,我們需要.NET服務器端的域模型......所以現在我們有三個模型在服務器端,亞音速模型,dto模型和領域模型。 dto模型更簡單,更像數據庫,領域模型有更多的邏輯。它變得複雜......我們現在必須將AS3域模型代碼與C#域模型代碼同步。如果我們可以再做一次(花時間重構),我認爲我們不會再使用dto,而是在客戶端和服務器之間傳輸域模型。問題是如果這是現實的。 Dto是簡單的物體,非常容易轉移。領域模型對象可能非常複雜。

是否有關於如何爲這些類型的應用程序創建架構的書籍?有很多經驗的人寫的書嗎?你有這方面的經驗嗎?

回答

1

現實情況是,客戶端和之間共享對象服務器相當複雜。下面是你需要使它發生什麼:

易/非可擴展的方式:

繼承MarshalByrefObject你的對象的所有。如果在服務器上創建對象A並將其發送給客戶端,則對該對象的任何客戶端修改都將自動轉發到服務器。

雖然這聽起來像是一個完美的解決方案,它有兩個主要問題:

  1. 客戶端和服務器緊密結合.NET(再見Web服務)
  2. 它可以是一個噩夢般的表現。所有的方法/財產訪問將被轉發到服務器。如果你選擇這條路線,你的對象應該設計爲粗笨的呼叫,而不是健談的呼叫。

可擴展/硬辦法:

而不是使用MarshalByRefObject,你會用DataContract/Serializable對象。但是:

  • 如果創建對象在服務器上,並將其發送給客戶端, 客戶端將接收對象的副本(我們稱之爲對象B
  • 當您發送對象B回服務器,服務器將接收對象B的 副本(姑且稱之爲對象C

但是你真的想要服務器對待對象A對象C作爲相同。不幸的是,CLR無法做到這一點,所以你需要一個對象合併坐在客戶端和服務器上。

對象合併將包含模型中所有對象的字典,並知道如何將兩個實例標識爲相同,併合並接收端的任何值。例如,如果客戶端已經在內存中擁有對象C,並且從服務器接收到更新的副本,則它將複製這些值。

不幸的是,這也充滿了問題,因爲你需要確保正確保存對象引用。您不能盲目地更新對象上的所有屬性,因爲該對象可能具有對其他對象的現有引用,這反過來又可能需要它們自己的合併。除此之外,您還需要跟蹤列表或詞典中包含的添加/刪除的對象。我正在爲我自己的框架添加n層支持,所以我現在正在經歷同樣的練習(我正在採用「可伸縮/硬」路線)。幸運的是,我有很多輔助基礎設施就地協助識別,合併等。如果您從頭開始,這將是一項重要的工作。

P.S.添加延遲加載代理到混合(我使用Nhibernate),它甚至得到更多有趣...

+0

偉大的信息,thx。我們使用延遲加載。對象合併似乎是一個有趣的想法,但要實現它... MarshalByrefObject也很有趣,但這確實是一個性能噩夢。我們經常使用客戶端的保存按鈕。它有優點和缺點......奇怪的是,我無法在這個複雜的問題上找到很多信息。謝謝! – 2009-11-02 22:17:08

0

轉到福勒讀什麼,particularily他的設計模式的東西(尤其是組裝模式,以及爲什麼需要你已經做什麼)

Fowler's Patterns Of Enterprise Application Architecture

+0

已經讀過它,理論上它都聽起來不錯,但實際上它是別的。假設我想閱讀一本試圖在我的項目中實施PoEAA的人的書。 – 2009-10-28 13:56:07

相關問題