[英]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.