关于存储库模式的一些事情我根本不明白

Posted

技术标签:

【中文标题】关于存储库模式的一些事情我根本不明白【英文标题】:Few things about Repository Pattern that I simply don't understand 【发布时间】:2012-07-22 01:25:34 【问题描述】:

我已经阅读了很多关于什么是 Repository 的主题,但仍然有一些问题困扰着我。

据我了解,Repository传统数据访问层 之间的唯一区别是 Repository 的 查询构造功能(即 Query Object 模式)。但是当阅读以下 Repository 模式 的定义时,似乎我们仍然可以拥有 Repository,即使我们没有实现 Query Object 模式

一) From:

存储库是我们传递和获取对象的唯一点。 它也是与存储开始通信的边界 并结束。

我认为上面的引用表明 Repository 是 DAL 的入口点。换句话说,根据引用,DAL 消费者(例如 Service 层)通过 Repository 与 DAL 通信。但是不应该 data context 代表 DAL 的入口点(因此 Repository 应该驻留在 data context 中)?

b) From:

存储库与传统存储库的主要区别 数据访问层是它的所有意图和目的 集合语义——就像 .Net 中的 IList

大多数传统 DAL 不是也有返回集合的方法(例如 List<Customer> GetAllCustomers())吗?那么,Repository 的类集合语义与传统 DAL 的类集合语义究竟有何不同?

c) From:

简而言之,存储库模式意味着抽象 持久层,将其屏蔽为一个集合。这种方式 应用程序不关心数据库和其他持久性 细节,它只处理抽象(通常编码为 接口)。

据我所知,上述定义与传统 DAL 的定义没有任何不同。 因此,如果 Repository 实现只执行两个功能 - 具有类似集合的语义并将域对象与数据库访问代码的细节隔离 - 它与 传统 DAL 有何不同?换句话说,它会/应该仍然被称为Repository吗?

d) 是什么让以下接口成为 Repository 接口 而不仅仅是常规的 DAL 接口

From:

public interface IPostsRepository
    
        void Save(Post mypost);
        Post Get(int id);
        PaginatedResult<Post> List(int skip,int pageSize);
        PaginatedResult<Post> SearchByTitle(string title,int skip,int pageSize);
    

谢谢

【问题讨论】:

【参考方案1】:

仅供参考,我问了一个非常相似的问题 over here 并得到了一些很好的答案。

最重要的是,它似乎取决于您的架构的复杂性。当您需要访问不同类型的数据存储时,存储库模式对于创建抽象层最有用,即一些数据在实体框架中,一些在文件系统中,等等。在更简单的 Web具有(可能不变)单一数据存储(即 SQL Server 或 Oracle 等中的所有数据)的应用程序不太重要。此时,实体框架上下文对象之类的东西充当实体对象的存储库。

【讨论】:

以上是关于关于存储库模式的一些事情我根本不明白的主要内容,如果未能解决你的问题,请参考以下文章

存储库和工作单元模式 - 如何保存更改

为高度相关的实体寻找关于存储库模式的基本指针

如何在存储库模式中为同一接口使用两个数据存储?

JavaScript 设计模式——处理不需要的异步

存储库和服务层之间的区别?

关于 CommitTransaction 的 EF Code First 问题 - 使用存储库模式