【问题标题】:Repository Pattern - Context and Data Mapping存储库模式 - 上下文和数据映射
【发布时间】:2013-02-08 14:24:33
【问题描述】:

我知道那里有很多存储库模式问题,但我希望有人能帮助我理解一些原则。

我总是看到使用上下文的存储库类构造函数,这个上下文通常是 EF 或 NHibernate。然后很容易将 dbset<T> 用于 CRUD 方法。由于我不使用这样的东西,而是通过 API 调用对非 sql 数据源进行调用,所以当没有底层上下文时,我无法弄清楚如何使用Repository<T>T GetById(int id) 之类的方法知道如何将<T> 翻译成正确的对象。我是否必须创建自定义上下文和我自己的数据映射?我最终会为我拥有的每个课程都有一个特定的存储库吗?不知何故,在某个地方,我需要获取 <T> 并知道它是什么,以便创建它并填写它的属性。

我已经看到了一些将存储库模式与文件一起使用的示例,看起来每种类型都有自己的存储库,在其中完成调用和映射。

任何针对多个数据源的存储库模式示例?

【问题讨论】:

  • 没有什么说您必须创建一个通用存储库。你最好在你的情况下创建特定的。

标签: repository repository-pattern data-mapping


【解决方案1】:

存储库模式是一个独立于一个或多个数据源的概念,其目的之一是抽象所有与持久性相关的。我认为您想要一个使用多个持久性类型的存储库实现示例。这很容易,因为存储库(作为实现)只是一个与 Ef 或其他无关的类。

事实上,您看到的大多数示例都是“错误的”,因为仅包装 Db 或 NH 上下文而没有任何其他内容,它没有任何作用。

关键是存储库使用了它需要的所有数据源。可能只有一个(最常见的情况),也可能是 2-3 个。假设上传了一个文件,您想将文件保存在文件系统上(或将其发送到云上?)并将一些元数据存储在本地数据库。

存储库将依赖一个 DAO(如 EF 上下文)与本地数据库对话,并直接访问文件系统。如果文件要上传到云端,存储库也会依赖于云提供商。

这里没有什么复杂的,存储库只使用数据库和云,同时将它们隐藏在应用程序的其余部分。该应用程序不关心您将在何处以及如何存储该文件。因此,当您编写 Repository 类时,只要您尊重合同(接口),您就可以做任何您想做的事情。

【讨论】:

  • 谢谢迈克。我同意。我遇到的问题是我不知道如何创建 T 类型的对象并将其返回,其属性是从我对数据源的调用返回的任何内容中填充的。从我的存储库中获得 T GetById(int id) 方法,我应该如何知道调用什么以及如何填充它,如果它可以是自通用的任何东西......对不起,我是新手,我是迷路了……
  • 只有当我每个类都有一个存储库时,我才能知道我正在处理的对象是什么,因此对数据源发出正确的调用并返回正确的类型。没有?
  • 忘记通用存储库。当实体被序列化存储时,我仅将它们用于聚合根存储库。当您处理多个数据源时,我认为它们不适合
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2013-09-07
  • 2013-11-11
  • 2018-03-16
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多