2

我注意到存储库通常以以下任一方式实现:

方法一

void Add(object obj);
void Remove(object obj);
object GetBy(int id); 

方法二

void Save(object obj);     // Used both for Insert and Update scenarios
void Remove(object obj);
object GetBy(int id);

方法 1 具有集合语义(这是定义存储库的方式)。我们可以从存储库中获取一个对象并对其进行修改。但我们不会告诉集合更新它。以这种方式实现存储库需要另一种机制来持久化对内存对象所做的更改。据我所知,这是使用工作单元完成的。但是,有些人认为只有当您需要系统中的事务控制时才需要 UoW。

方法 2 消除了拥有 UoW 的需要。您可以调用 Save() 方法,它会确定对象是新对象并且应该被插入还是被修改并且应该被更新。然后它使用数据映射器将更改持久保存到数据库中。虽然这使生活变得更加轻松,但建模的存储库没有集合语义。该模型具有 DAO 语义。

我真的很困惑。如果存储库模拟内存中的对象集合,那么我们应该根据方法 1 对它们进行建模。

您对此有何看法?

莫什

4

2 回答 2

2

我个人对将工作单元模式作为解决方案的一部分没有任何问题。显然,您只需要它用于 CRUD 中的 CUD。但是,您正在实现 UoW 模式这一事实无非表明您有一组需要作为批处理进行的操作。这与说它需要成为交易的一部分略有不同。如果您将存储库抽象得足够好,那么您的 UoW 实现可能与您正在使用的支持机制无关——无论是数据库、XML 等。

至于具体问题,我认为方法一和方法二之间的区别是微不足道的,如果没有其他原因,方法二的大多数实例都包含检查标识符是否已设置。如果设置,则视为更新,否则视为插入。在我看来,这个逻辑通常内置在存储库中,更多的是为了简化暴露的接口。存储库的目的是在消费者和数据源之间代理对象,并且无需直接了解数据源。我选择方法二,因为我相信检测标识符的简单逻辑,而不是依赖于跟踪整个应用程序的对象状态。

存储库使用的术语与数据访问和对象集合非常相似,这一事实导致了混淆。我只是将他们视为他们自己的一等公民,并为该领域做最好的事情。;-)

于 2010-09-01T19:06:07.077 回答
1

也许你想拥有:

T Persist(T entityToPersist);
void Remove(T entityToRemove);

“坚持”与“保存或更新”或“添加或更新”相同 - 即。Repo 封装了创建新身份(数据库可能会这样做),但总是返回带有身份引用的新实例。

于 2011-02-11T06:46:25.250 回答