簡體   English   中英

具有存儲庫模式的域模型

[英]Domain Model with Repository Pattern

我有一個對象:圖書館

一個圖書館可以有多本書籍,CD和論文。 每個類具有Id,Name和Price屬性,但具有Address屬性的Library類除外。

我想創建存儲庫模式以抽象出從以上各層存儲數據的位置。 現在,數據存儲在xml文件中。

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

稍后我們考慮將其存儲在數據庫中。 然后,我們將有一個圖書館表,一個書本表,一個CD表和一個紙質表。

用戶在屏幕上創建一個庫對象,然后在屏幕上創建書籍,cd和論文。

然后,他單擊保存。 到那時,我想獲取新創建的庫對象並將其保存為XML,以便擁有Repository並使用依賴項注入,我將在上面的層中注入xml存儲庫的實現,以便將數據存儲到正確的位置。 我可以序列化Library對象並獲取xml,然后調用簡單的Save方法來保存該庫對象。

但是想象一下,然后用DatabaseRepository替換XMLRepository。

在這種情況下,我希望上面的其余各層保持不變。 我希望LibraryRepository.Save()會注意是否需要使用XML或CSV或DB。 我很困惑如何創建一個存儲庫模式來解決LibraryRepository.Save()方法。

每個地方的每個人都說存儲庫類應該承擔一個責任。 它只應保存一種對象類型,而不應采用對象,采用其相關類並也保存它們。 每個類都應具有自己的存儲庫類。

同樣,每個庫對象都有多個Books對象。 我不想使用for循環來瀏覽LibraryRepository.Save方法中的每本書。

我不確定如何創建域模型並調用Library Save()方法。

請指導。

由於存儲庫是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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM