2009-12-17 96 views
0

該項目中有兩個數據源:一個是項目自己的數據庫,另一個是(半)舊式Web服務。問題在於管理員必須保持同步並管理兩者,以便用戶不必知道他們是單獨的(或者知道,但他們不在意)。用於管理兩個相關數據源的管理界面

下面是一個例子:有語言列表。這兩個應用程序 - 項目和傳統 - 都需要使用它們。但是,他們都添加了自己的意思。例如,項目可能需要激活/不激活,而遺產將需要語言代碼。

但管理部分必須管理所有內容 - 語言名稱,活動/不活動,語言代碼。加載時,兩個系統的數據必須合併並顯示,並且保存時,必須在兩個系統中更新數據。

因此,什麼是最好的方式來表示這種分離的數據(要在管理頁面中使用)?請注意,我使用ASP.NET MVC/NHibernate。

  1. 如何管理遺留數據?
    • 我是否將管理部分連接到遺留Web服務外部接口 - 目前它只有GetXXX()方法 - 並添加了錯過的C [UD]方法?
    • 或者,我直接連接到遺留數據庫 - 這是可能的,因爲我確實控制它。
  2. 我該怎麼做數據拆分/合併 - 在控制器/服務層,還是在存儲庫/數據層?
    • 在控制器層我會做「VAR視圖模型=新的視圖模型{邁德特= ...,LegacyData = ...};問題 - 遺留問題混亂代碼
    • 在數據層,我會做「var model = repository.get(id)」,模型將包含來自這兩個世界的數據,並且當我做「repository.Save(entity)」時,它將更新兩個數據源 - 在本地數據庫只有項目特定的字段將被存儲。問題:a)可能的泄露抽象b)始終只從Web服務獲取數據,而有時僅需要管理部分
      • 修改,使用ICombinedRepository <語言>它將提供額外的拆分/合併。問題:還需要無論是新的模型或IWithLegacy <語言,LegacyLanguage > ...
  3. 有一個單一的 「同步」 的方法;這將刪除項目項列表中不存在遺留的物品,更新那些目前,創建錯過遺留的物品,等...

好了,總結的主要問題:

  • 在Web服務上開發CRUD接口還是直接連接到它的數據庫(這是在我完全控制下的,這樣我甚至可以在以後決定將該Web服務部分移入主應用程序或使其使用主數據庫)?
  • 我有獨立的項目和遺留實體的類,因此單獨管理,或有項目的實體具有所有遺留領域,保存/加載時透明地管理?

無論如何,是否有任何有用的技巧來管理大部分來自不同來源的重複數據?什麼是最佳實踐?

在非管理部分,我想完全隱藏遺留數據的概念。這就是我現在所做的,在存儲庫接口後面。但對於管理員部分來說,它並不那麼清晰或簡單...

回答

1

你在這裏描述的內容似乎需要一個反腐敗層。您可以在此處找到與此主題相關的解決方案:DDD, Anti Corruption layer, how-to?

如果您有兩個概念有界上下文,但您只使用DDD作爲其中之一,則防腐層會發揮作用。當讀取您的數據源(執行獲取操作[R])時,反腐敗層會將您的遺留數據轉換爲項目的可用對象。當寫入您的數據源(執行設置操作[CUD])時,反腐敗層將您的DDD對象轉換爲您的遺留代碼所理解的對象。

是否使用現有的Web服務取決於您是否願意更改現有的代碼。堅持DRY的做法,你不想重複你已有的東西。如果你想保留Web服務,你可以在反腐敗層中添加CUD方法,而不會影響你的遺留應用程序。

在反腐敗層中,您將希望利用適配器和外觀爲您的DDD項目和遺留應用程序集合不同的類。

反腐敗層正是您處理拆分和合並的地方。

讓我知道你是否對此有任何疑問,因爲它可能是一個有點高級的話題。我會盡力回答。

祝你好運!

+0

雖然我知道反腐敗層,並且您描述了需要相當好的東西(鏈接也很有用),但這裏的主要問題在於它不是很傳統;我可以完全訪問它,我可以添加/調整接口(保持兼容性),甚至可以訪問數據庫並更改其模式!所以我想知道避免A-CL(我目前用於只讀訪問)更好。 – queen3 2009-12-19 10:14:20

+0

@ queen3我明白了。你必須問自己,調整這些接口是否會以負面的方式影響遺留系統的表達域。這聽起來像你有兩個有界的上下文保持完好。統一所有域名的一種模式是反模式(IMHO)。你不想最終通過代碼不能完全揭示其真實意圖的遺留系統。即使您將遺留系統重構爲更多DDD,它仍然可能以不同的方式表示域,並且仍需要A-CL。總之,我的建議是:如果你需要兩個有界上下文,保持A-CL。 – 2009-12-20 00:38:41