我正在编写一个ORM,并且不确定仓库的预期行为,或者更准确地说,是存储库和工作单元之间的边界。根据我的理解,一个仓库可能如下所示:
interface IPersonRepository
{
public function find(Criteria criteria);
public function add(Person person);
public function delete(Person person);
}根据福勒的说法(PoEAA,第322页):
存储库在域和数据映射层之间进行中介,其作用就像内存中的域对象集合。..。对象可以添加到存储库中并从存储库中移除,就像它们可以从简单的对象集合中删除一样。
这意味着下面的测试应该有效(假设我们已经有一个人持久化了,其姓氏是Fowler):
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。但是当单独使用时,这个仓库难道不能导致意想不到的、不可预测的行为吗?
发布于 2011-05-18 23:35:01
存储库在域和数据映射层之间进行中介,其作用就像内存中的域对象集合。..。对象可以添加到存储库中并从存储库中移除,就像它们可以从简单的对象集合中删除一样。
这并不意味着您不需要保存方法。您仍然需要显式地将更改提交到存储中。
请参阅工作模式的单位与坚持不懈的无知
public interface IUnitOfWork {
void MarkDirty(object entity);
void MarkNew(object entity);
void MarkDeleted(object entity);
void Commit();
void Rollback();
}在某种程度上,您可以将工作单元视为转储所有事务处理代码的地方。工作股的职责是:
发布于 2011-06-09 02:15:53
我想你要问的是:http://martinfowler.com/eaaCatalog/identityMap.html
存储库应该将获取的对象保存在内存中,并且不应该从持久性存储中检索对该实体的所有后续调用,因此您的示例应该工作得很好。
https://stackoverflow.com/questions/6050223
复制相似问题