2013-02-08 28 views
0

我知道有很多存儲庫模式問題,但我希望有人能夠幫助我理解一些原則。存儲庫模式 - 上下文和數據映射

我總是看到使用上下文的存儲庫類構造函數,這個上下文通常是EF或NHibernate。然後它很容易使用CRUD方法的dbset<T>。由於我沒有使用類似的東西,而是通過API調用來調用非sql數據源,所以當沒有底層的上下文知道如何使用Repository<T>T GetById(int id)時,我無法弄清楚如何使用Repository<T>。將<T>翻譯爲正確的方格。我是否必須創建自定義上下文和我自己的數據映射?我最終會爲每個班級擁有一個特定的知識庫嗎?不知怎的,在某個地方,我需要採取那個<T>並知道它是爲了創建它並填寫它的屬性。

我見過一些示例,其中存儲庫模式與文件一起使用,看起來每個類型都有自己的存儲庫,其中調用和映射完成。

定位多個數據源的Repository Pattern的任何示例?

+0

沒有什麼說你必須創建一個通用的存儲庫。你最好在你的案例中創建特定的。 – jgauffin 2013-02-13 07:39:42

回答

0

存儲庫模式是獨立於一個或多個數據源的概念,其目的之一是抽象所有與持久性相關的目的。我想你想要一個存儲庫實現的例子,其中使用了多個持久性類型。這很容易,因爲存儲庫(作爲實現)只是一個與Ef無關的類。

事實上,你所看到的大多數例子都是「錯誤的」,因爲只是在沒有其他任何東西的情況下包裝了一個Db或NH環境,它什麼都不做。

重點是存儲庫使用它所需的所有數據源。它可能只有一個(最常見的情況),或者它可能是2-3。比方說,文件已上傳,並且您希望將文件保存在文件系統上(或將其發送到雲端?),並將一些元數據存儲在本地數據庫。

存儲庫將作爲依賴DAO(如EF上下文)與本地數據庫交談,並直接訪問文件系統。如果要將文件上傳到雲,存儲庫還將依賴於雲提供商。

這裏沒有什麼複雜的,Repository只是使用數據庫和雲,而從應用程序的其餘部分隱藏它們。該應用程序不關心在哪裏以及如何存儲該文件。因此,當您編寫Repository類時,只要遵守合約(界面),就可以做任何你想做的事情。

+0

謝謝邁克。我同意。我遇到的問題是我不知道如何創建類型爲T的對象,並使用從我返回的數據源調用中填充的屬性返回它。從我的存儲庫中獲取T GetById(int id)方法,我該如何知道要調用什麼以及如何填充它,如果它可以是任何東西,因爲泛型...對不起,我是新手,我是丟失...... – jbrabant 2013-02-09 01:02:32

+0

只有當每個類有一個存儲庫時,我才能知道我正在處理的對象是什麼,因此發出對數據源的正確調用並返回正確的類型。沒有? – jbrabant 2013-02-09 01:09:39

+0

忘記通用存儲庫。當實體存儲爲序列化時,我僅將它們用於聚合根存儲庫。當你處理多個數據源時,我認爲它們不適合 – MikeSW 2013-02-09 08:02:01