首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >储存库的预期行为

储存库的预期行为
EN

Stack Overflow用户
提问于 2011-05-18 19:51:00
回答 2查看 123关注 0票数 0

我正在编写一个ORM,并且不确定仓库的预期行为,或者更准确地说,是存储库和工作单元之间的边界。根据我的理解,一个仓库可能如下所示:

代码语言:javascript
复制
interface IPersonRepository
{
    public function find(Criteria criteria);
    public function add(Person person);
    public function delete(Person person);
}

根据福勒的说法(PoEAA,第322页):

存储库在域和数据映射层之间进行中介,其作用就像内存中的域对象集合。..。对象可以添加到存储库中并从存储库中移除,就像它们可以从简单的对象集合中删除一样。

这意味着下面的测试应该有效(假设我们已经有一个人持久化了,其姓氏是Fowler):

代码语言:javascript
复制
collection = repository.find(lastnameEqualsFowlerCriteria);
person = collection[0];

assertEquals(person.lastname, "Fowler");

person.lastname = "Evans";
newCollection = repository.find(lastnameEqualsFowlerCriteria);

assertFalse(newCollection.contains(person));

这意味着,当映射到数据库时,即使在某个地方没有调用显式save()方法,Person模型也必须由Repository自动持久化,以便下一个查询返回正确的集合,而不是包含原始人员的

但是,这难道不是工作单元的职责吗?决定哪种模型能够持久地保存到数据库中,以及什么时候?

在上面的实现中,Repository必须决定在接收另一个find()调用时持久化先前检索的人,以便结果与修改一致。但是,如果没有发出其他find()调用,那么模型就不会隐式地持久化。

在工作单元的上下文中,这并不是一个真正的问题,因为我们可以在开始时启动一个事务,并在需要时将任何插入回滚到db。但是当单独使用时,这个仓库难道不能导致意想不到的、不可预测的行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 23:35:01

存储库在域和数据映射层之间进行中介,其作用就像内存中的域对象集合。..。对象可以添加到存储库中并从存储库中移除,就像它们可以从简单的对象集合中删除一样。

这并不意味着您不需要保存方法。您仍然需要显式地将更改提交到存储中。

请参阅工作模式的单位与坚持不懈的无知

代码语言:javascript
复制
public interface IUnitOfWork {
  void MarkDirty(object entity);
  void MarkNew(object entity);
  void MarkDeleted(object entity);
  void Commit();
  void Rollback();
}

在某种程度上,您可以将工作单元视为转储所有事务处理代码的地方。工作股的职责是:

  • 管理事务。
  • 命令数据库插入、删除和更新。
  • 防止重复更新。在工作单元对象的单一使用范围内,代码的不同部分可能标记相同的发票对象,但工作单元类只对数据库发出一个更新命令。
票数 1
EN

Stack Overflow用户

发布于 2011-06-09 02:15:53

我想你要问的是:http://martinfowler.com/eaaCatalog/identityMap.html

存储库应该将获取的对象保存在内存中,并且不应该从持久性存储中检索对该实体的所有后续调用,因此您的示例应该工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6050223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档