在我研究存储库模式的过程中,我一直对我所阅读的内容感到困惑。我想知道人们是否(错误地?)在他们仅仅表示数据访问层时使用该词。
由于在设计模式(GoF)的索引中找不到“存储库” ,因此我转向了企业应用程序架构模式(Fowler)。Fowler 似乎很清楚(第 323 页),当他声明客户端创建标准对象并将其传递到存储库以获取结果时。它看起来像这样:
public class Person
{
public List<Person> Dependents()
{
Repository repository = Registry.personRepository();
Criteria criteria = new Criteria();
criteria.equal(Person.BENEFACTOR, this);
return repository.matching(criteria);
}
}
标准对象是使存储库成为存储库的原因吗?如果不是,那是什么?如果抽象持久性机制(并因此构造查询)是目标,那么存储库与简单的 DAL/ORM 调用有何不同,如下所示:
public class PersonLogic
{
public List<Person> GetDependents()
{
IPersonData personData = DependencyContainer.Resolve<IPersonData>();
return personData.GetDependents();
}
}
对我来说,区别如下所示:
* 使用存储库模式,客户端构造不同的标准对象并在其上调用 Matching() 方法。
* 使用简单的 DAL,客户只需根据需要调用不同的方法。
还有比这更多的吗?当程序员真正指的是 DAL 时,他们是否错误地使用了术语“存储库”?
编辑
David Osborne 将此链接发送到Persistence Patterns。它指出:
基本上,存储库模式只是意味着在您的持久性系统上放置一个外观,这样您就可以屏蔽应用程序的其余代码,而不必知道持久性是如何工作的。
这就是数据访问层的真正含义。在我看来,存储库和 DAL 确实是一回事,也许“真正的”存储库使用标准对象。