2012-05-27 103 views
3

我有一個對象:庫存儲庫模式的域模型

一個庫可以有多個Books,CD和Papers。除具有Address屬性的Library類外,每個類都有Id,Name和Price屬性。

我想創建Repository模式來抽象上面的圖層存儲數據的位置。現在,數據存儲在xml文件中。

<library> 
<books></books> 
<cds></cds> 
<papers></papers 
</library> 

後來我們考慮將它存儲在數據庫中。然後,我們將有一個圖書館的桌子,一本書桌,一張CD桌子和一張紙桌子。

用戶在屏幕上創建庫對象,然後在屏幕上創建書籍,CD和紙張。

然後他點擊保存。在這一點上,我想把新創建的庫對象保存爲XML,所以我想要有Repository和使用依賴注入,我將在上面的層中注入一個xml存儲庫的實現,以便將數據存儲到正確的位置。我可以序列化Library對象並獲取xml並調用簡單的Save方法來保存庫對象。

但想象一下,我將XMLRepository替換爲DatabaseRepository。

在這種情況下,我希望上面的其餘層保持不變。我希望LibraryRepository.Save()會關心它是否需要進入XML或CSV或DB。 我很困惑我將如何創建一個Repository模式來解決LibraryRepository.Save()方法。

大家都在說Repository類應該有單一的責任。 它應該只保存一個對象類型,不應該帶一個對象,取其相關的類並保存它們。每個類都應該有它自己的Repository類。

另外每個庫對象都有多個Books對象。我不想使用for循環並遍歷LibraryRepository.Save方法中的每本書。

我不知道如何創建我的域模型並調用Library Save()方法。

請指導。

+0

看看這篇文章從MSDN領域驅動設計http://msdn.microsoft.com/en -us /雜誌/ dd419654.aspx。文章討論了很多這些問題,並鏈接到其他相關信息。您不應爲每個對象創建一個存儲庫,而應爲每個「聚合」創建一個存儲庫。構成邏輯實體的對象組。 –

+0

我認爲使用一些ORM會更好。您可以隨時更改基礎數據提供者。例如,NHiberante可以將數據存儲在CSV文件中(檢查此問題http://stackoverflow.com/questions/680994/can-nhibernate-persist-to-flat-files-instead-of-database)。 –

回答

2

由於存儲庫是BL的持久性抽象,因此使用存儲庫接口。

每個存儲庫實現應負責對象結構映射到數據存儲或使用特定的映射器。 BL/Service類可以通過接口與存儲庫協同工作,無需知道特定存儲庫的內部實現。

所以你必須像

class LibraryService { 
    public LibraryService (ILibraryRepository repo) {} 
    public DoSomeWork(somedata) { 
     Library lib = repo.Load(somedata.libid); 
     .... 
     repo.Save(lib); 
    } 
} 

而且幾種實現

class DBLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //hibernate session 
     //and you'll have mapping defined for all entities 
     //and relations between library and stuff, so books are saved automatically 
     _session.Save(lib) 
    } 
} 

class XMLLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //serialized does all the work, so no additional loops here 
     var xml = Serialize(lib); 
     SaveToFile(xml); 
    } 
} 

class CSVLibraryRepository : ILibraryRepository { 
    public Save(Library lib) { 
     //for example, save library to lib.csv, books - to books.csv. 
     //add mappers to do real work, but we'd take care of separation 
     //of books and library manually. 
     // (in case of ORM - it has own mappers, 
     // for XML - serializator is mapper itself) 
     var data = LibraryCSVDataMapper.Map(lib); 
     data.Save(); 
     foreach(var book in lib.Books){ 
      data = BookCSVDataMapper.Map(book); 
      data.Save(); 
     } 
    } 
}