存储库模式 - POCO还是IQueryable?

时间:2009-04-12 09:01:26

标签: repository-pattern

我是Repository Pattern的新手,在网上做了很多阅读后,我对发生的事情有了大致的了解,但似乎存在想法冲突。

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

我想只处理Pocos,所以我会为每个聚合根提供一个IRepository实现,如下所示:

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

其中IOrangeCriteria采用了许多特定于查找Orange的参数。

我拥有的另一件事是一些数据后端 - 这就是我首先进入这种模式的原因。我想我会为每个实现一个实现,例如

OrangeRepositoryOracle,OrangeRepositorySQL,OrangeRepositoryMock等

我想保持它开放以便我可以使用EF或NHibernate - 如果我的IOrangeRepository处理POCO然后我会通过实现OrangeRepositoryNHibernate等将其封装在Repository本身中。

我在正确的路线上吗?

由于

编辑:感谢您的反馈,我现在没有其他任何人反对这些想法,所以感激不尽!

2 个答案:

答案 0 :(得分:9)

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

请注意,使用IQueryable版本,您仍然可以根据您的POCO课程开始工作,但您必须与IQueryable相关联。还要考虑你可能有使用IQueryable的代码然后结果你遇到了一个存储库的ORM没能很好地处理它的情况。

答案 1 :(得分:5)

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

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

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

然后你得到

public class OrangeRepository: IOrangeRepository {  
    public IQueryable<Orange> GetOranges();
}