2013-02-08 79 views
0

我知道有很多存储库模式问题,但我希望有人能够帮助我理解一些原则。存储库模式 - 上下文和数据映射

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

我见过一些示例,其中存储库模式与文件一起使用,看起来每个类型都有自己的存储库,其中调用和映射完成。

定位多个数据源的Repository Pattern的任何示例?

+0

没有什么说你必须创建一个通用的存储库。你最好在你的案例中创建特定的。 – jgauffin 2013-02-13 07:39:42

回答

0

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

事实上,你所看到的大多数例子都是“错误的”,因为只是在没有其他任何东西的情况下包装了一个Db或NH环境,它什么都不做。

重点是存储库使用它所需的所有数据源。它可能只有一个(最常见的情况),或者它可能是2-3。比方说,文件已上传,并且您希望将文件保存在文件系统上(或将其发送到云端?),并将一些元数据存储在本地数据库。

存储库将作为依赖DAO(如EF上下文)与本地数据库交谈,并直接访问文件系统。如果要将文件上传到云,存储库还将依赖于云提供商。

这里没有什么复杂的,Repository只是使用数据库和云,而从应用程序的其余部分隐藏它们。该应用程序不关心在哪里以及如何存储该文件。因此,当您编写Repository类时,只要遵守合约(界面),就可以做任何你想做的事情。

+0

谢谢迈克。我同意。我遇到的问题是我不知道如何创建类型为T的对象,并使用从我返回的数据源调用中填充的属性返回它。从我的存储库中获取T GetById(int id)方法,我该如何知道要调用什么以及如何填充它,如果它可以是任何东西,因为泛型...对不起,我是新手,我是丢失...... – jbrabant 2013-02-09 01:02:32

+0

只有当每个类有一个存储库时,我才能知道我正在处理的对象是什么,因此发出对数据源的正确调用并返回正确的类型。没有? – jbrabant 2013-02-09 01:09:39

+0

忘记通用存储库。当实体存储为序列化时,我仅将它们用于聚合根存储库。当你处理多个数据源时,我认为它们不适合 – MikeSW 2013-02-09 08:02:01