2012-03-22 71 views
6

我有一個存儲庫,它實現了接口IRepository。存儲庫對實體框架(代表)應用程序執行查詢,並直接返回生成的實體對象。實體對象是否應該由存儲庫公開?

實施IRepository時的要點是,它可以在將來轉換爲不同的存儲庫。然而,返回實體框架返回的確切實體對象將會破壞這個。這可以接受嗎?

因此,存儲庫是否應該將所有實體框架對象轉換爲業務對象,然後再將其暴露給應用程序?這些對象應該實現一個接口還是具有一個通用的基類?

+1

你想支持什麼'不同的存儲庫'。你的意思是從EF切換到NHibernate?如果是這樣的話,你可能會比IRepository接口產生更多的變化。 – 2012-03-22 12:40:12

+0

我並沒有特別想到任何東西,但我希望我的應用程序更健壯。你在想什麼其他的改變? – 2012-03-22 12:44:46

回答

10

存儲庫接口應該只處理業務/域實體,即存儲庫只發送和接收應用程序已知的對象,與底層持久存取實現無關的對象。

EF或Nhibernate實體正在建模持久性數據而不是域的。因此,IRepository不應該返回一個對象,該對象是ORM的實現細節,而是可以直接由應用程序使用的對象(根據操作可以是域實體或簡化的視圖模型)。

在存儲庫實現中,您將處理將映射到相應應用實體(通常使用映射器(如AutoMapper))的ORM實體。長話短說,設計IRepository時忘記了它的實現。這就是爲什麼在決定是否使用ORM之前設計界面更好。

基本上,存儲庫是應用程序域上下文和persitence上下文之間的網關,應用程序不應該耦合到存儲庫的實現細節。

+0

+1確認我問這個問題的原因 – 2012-03-22 13:51:51

1

你應該看看使用其中一個POCO模板來生成實體。這樣你的實體對Entity Framework沒有特別的依賴關係,並且可以在層間自由傳遞。與維護一個完全獨立的領域模型和兩者之間的映射(除非你的領域模型與你的實體模型明顯不同,在這種情況下它會更有意義)相比,它節省了大量的工作量。

0

如果您使用的是POCO實體,您可以假設任何提供者都會執行類似的工作。另外,請記住,您正在返回的實體的屬性映射到數據庫。所以你可以假設除非實體對每個提供者有不同的屬性名稱(我找不到具有不同名稱的邏輯解釋),你可以直接從存儲庫返回它們的業務。

相關問題