存储库模式 - POCO 还是 IQueryable?

发布于 2024-07-16 14:47:46 字数 663 浏览 3 评论 0原文

我是存储库模式的新手,在网上阅读了大量内容后,我对正在发生的事情有了粗略的了解,但似乎存在思想冲突。

一是 IRepository 应返回的内容。

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

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

其中 IOrangeCriteria 接受一些特定于查找 Orange 的参数。

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

OrangeRepositoryOracle、OrangeRepositorySQL、OrangeRepositoryMock 等,

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

我的路线正确吗?

谢谢

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

I'm new to the Repository Pattern and after doing a lot of reading on the web I have a rough understanding of what is going on, but there seems to be a conflict of ideas.

One is what the IRepository should return.

I would like to deal in ONLY Pocos so I would have an IRepository implementation for every aggregate root, like so:

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

where IOrangeCriteria takes a number of arguments specific to finding an Orange.

The other thing I have is a number of data back-ends - this is why I got into this pattern in the first place. I imagine I will have an implementation for each, e.g

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock etc

I would like to keep it open so that I could use EF or NHibernate - again if my IOrangeRepository deals in POCOs then I would encapsulate this within the Repository itself, by implementing a OrangeRepositoryNHibernate etc.

Am I on the right lines?

Thanks

EDIT: Thanks for the feedback, I don't have anyone else to bounce these ideas off at the moment so it is appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞花火° 2024-07-23 14:47:46

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

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

Yes, your version is the safest / most compatible one. You can still use it with about any resources, not only data access ones, but with web services, files, whatever.

Note that with the IQueryable version you still get to work based on your POCOs classes, but you are tied to the IQueryable. Also consider that you could be having code that uses the IQueryable and then turns out it you hit a case where one of the repository's ORM doesn't handle it well.

请你别敷衍 2024-07-23 14:47:46

我使用和你一样的模式。 我很喜欢。 您可以从任何资源获取数据。

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

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

然后你得到

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

I use the same pattern as you do. I like it a lot. You can get your data from any resources.

But the advantage of using IQuerable is that you do not have to code your own criteria API like the OrangeCriteria.

When NHibernate gets full Linq support then I may switch to the IQueryable.

Then you get

public class OrangeRepository: IOrangeRepository {  
    public IQueryable<Orange> GetOranges();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文