我是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本身中。
我在正确的路线上吗?
由于
编辑:感谢您的反馈,我现在没有其他任何人反对这些想法,所以感激不尽!
答案 0 :(得分:9)
是的,您的版本是最安全/最兼容的版本。您仍然可以将它与任何资源一起使用,不仅包括数据访问资源,还包括Web服务,文件等等。
请注意,使用IQueryable版本,您仍然可以根据您的POCO课程开始工作,但您必须与IQueryable相关联。还要考虑你可能有使用IQueryable的代码然后结果你遇到了一个存储库的ORM没能很好地处理它的情况。
答案 1 :(得分:5)
我使用与你相同的模式。我很喜欢。您可以从任何资源获取数据。
但使用IQuerable的优点是您不必像OrangeCriteria那样编写自己的标准API。
当NHibernate获得完整的Linq支持时,我可以切换到IQueryable。
然后你得到
public class OrangeRepository: IOrangeRepository {
public IQueryable<Orange> GetOranges();
}