存储库模式 - POCO还是IQueryable?

Dun*_*can 12 repository-pattern

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

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

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

public class OrangeRepository: IOrangeRepository
{
  public Orange GetOrange(IOrangeCriteria criteria);
}
Run Code Online (Sandbox Code Playgroud)

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

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

OrangeRepositoryOracle,OrangeRepositorySQL,OrangeRepositoryMock等

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

我在正确的路线上吗?

谢谢

编辑:感谢您的反馈,我没有其他任何人在此刻反弹这些想法,所以感谢!

egl*_*ius 9

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

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


小智 5

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

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

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

然后你得到

public class OrangeRepository: IOrangeRepository {  
    public IQueryable<Orange> GetOranges();
}
Run Code Online (Sandbox Code Playgroud)