我正在創建n層應用程序體系結構。不同的層不知道任何其他內部實現,層之間的通信通過IoC/DI輔助的非常狹窄的接口進行處理。如何將對象類型從業務層傳遞到數據層
現在我將業務對象(在業務層中定義)傳遞給數據層。業務層本身並不知道如何以及在何處保存數據(通常數據庫,但業務層不應該知道這一點)。通過實施IDataReader將業務對象傳遞到數據層(此方法還支持將來場景中批量加載數據)。數據層讀取IDataReader中的所有數據,並調用一些存儲過程將數據保存到數據庫(如果保存了一個對象,則IDataReader返回「一行」)。
實際的問題是在這裏:
因爲我傳遞的IDataReader以數據層和其類型斷開數據,什麼是在這種情況下,最好的辦法,以確定地方的數據?
示例如果我將實際的「用戶」類型的業務對象傳遞給數據層,那麼數據層應該將數據保存到表「用戶」中。在另外一些情況下,數據可能會保存到某個不同的結構中,而與業務層的類型無關。
在當前實現中,我將業務對象的類型信息傳遞到數據層和數據層,檢查此類型並確定將數據放置在何處。
數據層檢查傳入數據並確定其位置或數據層是否應顯示可以保存數據的「位置」列表(enum?)是否正確?
在此先感謝!
/澄清:
選項,我在這裏看到的是: 1.數據層提供了其中的數據可以保存 2.數據層給出巡視參數(如該類型ARG「plces」名單)以及存儲數據的地點
第一種選擇懲罰;如果我嘗試將「產品」類型的商業對象存儲到通常由類型「用戶」使用的結構中,那麼該怎麼辦?
第二種選擇懲罰;我必須將類型「Namespace1.Namespace2.User」映射到將其數據保存到表「用戶」的特定例程。所以手工做一些映射爲每種類型的...
/澄清2:
現在我找回這樣的:
service.Retrieve(typeof(Catalog), null, catalogArgs, e => catalogConverter.Read(e));
所以我通過typeof運算(目錄)到數據層。 ..所以我有數據層的類型信息。
現在在數據層中,我需要選擇難以從數據庫中獲取數據的「適配器」。我可以編寫巨大的if/switch結構來選擇適配器......這令人沮喪。我也可以寫屬性,並使用它像這樣:
[TypeAdapterAttribute("Namespace1.Namespace2.Catalog, and assembly info...")]
class CatalogAdapter { ... }
然後,我有代碼,不會從給定類型映射屬性值...
...但它是一點點膨脹和問題,硬編碼類型的字符串...
任何建議...?
/澄清3
我有想法,該系統可以通過「可插拔的業務模塊」進行擴展。這些模塊包含基本業務邏輯所不知道的業務對象(以及某些邏輯),數據層也完全不瞭解「插入的程序集」中包含的這些業務對象。此外部業務模塊沒有提及基礎業務層或數據層。當此外部程序集的業務對象被保存(=發送到數據層)時,數據層默認將其保存爲EAV樣式(http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80% 93value_model)數據結構自動。由於這種數據結構可能存在一些性能問題,因此數據層必須有辦法將特定業務對象類型保存在其自己的專用數據結構(通常是具有一對一映射的表)中。所以問題來了,如何實現這個「選擇決定」:)
這裏的想法是,我可以創建很多新的業務對象,我可以將它們全部保存到數據層,而不需要實際編碼任何東西到數據層!之後,如果需要,我可以爲選定的業務對象創建自己的專用數據結構。
說明3描述了全新的先決條件並提出了一個全新的問題。您可以根據屬性的數量進行決定。幾個屬性 - > EAV,很多屬性 - >專用模型。您可以確定像這樣的屬性'PropertyInfo [] props = obj.GetType()。GetProperties();' – 2012-03-19 14:09:02
那麼,C3仍然是大約相同的系統。我只是試圖澄清系統的目標。我想我可能會打開新的問題後,我一直在考慮這一點.... – Harza 2012-03-19 17:10:19