12

我是存储库模式的新手,在网上做了很多阅读之后,我对正在发生的事情有了一个粗略的了解,但似乎存在思想冲突。

一个是 IRepository 应该返回的内容。

我只想处理 Pocos,所以我将为每个聚合根都有一个 IRepository 实现,如下所示:

public class OrangeRepository: IOrangeRepository
{
  public Orange GetOrange(IOrangeCriteria criteria);
}

其中 IOrangeCriteria 采用一些特定于查找橙色的参数。

我拥有的另一件事是许多数据后端——这就是我首先进入这种模式的原因。我想我将为每个人都有一个实现,例如

OrangeRepositoryOracle、OrangeRepositorySQL、OrangeRepositoryMock 等

我想让它保持打开状态,以便我可以使用 EF 或 NHibernate - 如果我的 IOrangeRepository 处理 POCO,那么我将通过实现 OrangeRepositoryNHibernate 等将其封装在存储库本身中。

我在正确的路线上吗?

谢谢

编辑:感谢您的反馈,目前我没有其他人可以提出这些想法,因此不胜感激!

4

2 回答 2

9

是的,您的版本是最安全/最兼容的版本。您仍然可以将它用于任何资源,不仅是数据访问资源,还可以用于 Web 服务、文件等。

请注意,使用 IQueryable 版本,您仍然可以根据您的 POCO 类工作,但您与 IQueryable 相关联。还要考虑您可能拥有使用 IQueryable 的代码,然后发现您遇到了存储库的 ORM 之一不能很好地处理它的情况。

于 2009-04-12T10:00:04.243 回答
5

我使用与您相同的模式。我很喜欢。您可以从任何资源中获取数据。

但是使用 IQuerable 的优点是您不必像 OrangeCriteria 那样编写自己的标准 API。

当 NHibernate 获得完整的 Linq 支持时,我可能会切换到 IQueryable。

然后你得到

public class OrangeRepository: IOrangeRepository {  
    public IQueryable<Orange> GetOranges();
}
于 2009-04-12T10:44:39.147 回答