具有存储库模式的域模型
本文关键字:模型 模式 存储 | 更新日期: 2023-09-27 18:35:24
我有一个对象:库
一个图书馆可以有多个书籍、CD 和论文。 每个类都有 Id、Name 和 Price 属性,但具有 Address 属性的库类除外。
我想创建存储库模式以从上面的层抽象数据的存储位置。 现在,数据存储在xml文件中。
<library>
<books></books>
<cds></cds>
<papers></papers
</library>
稍后我们会考虑将其存储在数据库中。 然后,我们将有一个图书馆桌,一个书籍桌,一个CD桌和一个论文桌。
用户在屏幕上创建一个库对象,然后在屏幕上创建书籍、CD 和纸张。
然后他点击保存。 此时,我想获取新创建的库对象并将其保存在 XML 中,因此我想拥有存储库并使用依赖注入,我将在上面的层中注入 xml 存储库的实现,以便将数据存储到正确的位置。 我可以序列化 Library 对象并获取 xml 并调用简单的 Save 方法来保存库对象。
但是想象一下,我用DatabaseRepository替换XMLRepository。
在这种情况下,我希望上面的其余层保持不变。 我希望 LibraryRepository.Save() 能够处理它是否需要输入 XML 或 CSV 或 DB。我很困惑我将如何创建一个存储库模式来解决 LibraryRepository.Save() 方法。
各地的每个人都说存储库类应该有一个单一的责任。它应该只保存一种对象类型,不应该接受一个对象,获取其相关类并保存它们。 每个类都应该有自己的存储库类。
此外,每个库对象都有多个 Books 对象。 我不想使用 for 循环并在 LibraryRepository.Save 方法中浏览每本书。
我不确定我应该如何创建我的域模型并调用库 Save() 方法。
请指导。
由于存储库是 BL 持久性的抽象,请使用存储库接口。
每个存储库实现都应负责对象结构映射到数据存储,或使用特定的映射器。BL/服务类将通过接口与存储库一起工作,而无需了解特定存储库的内部实现。
所以你会有类似的东西
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();
}
}
}