23

在我研究存储库模式的过程中,我一直对我所阅读的内容感到困惑。我想知道人们是否(错误地?)在他们仅仅表示数据访问层时使用该词。

由于在设计模式(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 确实是一回事,也许“真正的”存储库使用标准对象。

4

2 回答 2

6

查看“使用 IQueryable 接口”部分以及扩展和增强订单和注册有界上下文。它对 DAO/Repository 实现进行了深入而平衡的讨论。

正如 Bob Horn 随后强调的,持久性模式文章总结了:

基本上,存储库模式只是意味着在您的持久性系统上放置一个外观,这样您就可以屏蔽应用程序的其余代码,而不必知道持久性是如何工作的。

于 2012-12-31T15:10:15.080 回答
4

总的来说,我同意作者的陈述,但我想补充一些细节

RepositoryDAL/ORM之间的区别首先不仅抽象了持久性机制,还提供了类集合接口来访问域对象……并将域对象与数据库访问代码的细节隔离开来:

差异

对于外部层,例如业务逻辑:

  • 有助于避免泄漏抽象。外部层依赖于Repository的抽象,而不是DAL/ORM的特定实现。因此,您可以在使用Repository时避免所有基础架构和逻辑依赖项。
  • 使用域对象而不是 POJO/POCO/DTO 的实例进行操作
  • CRUD操作应用于Repository提供的类集合接口,而不是特定的DAL/ORM方法。例如:使用实现的集合,而不是上下文或会话IEnumerable

相似之处

存储库下面包含DAL/ORM并用于相同的目的

于 2013-01-04T20:49:15.940 回答