C#学习教程:使用RavenDB实现存储库和服务模式主要关注的是我的存储库界面应该是什么样子,因为在RavenDB中我使用多个索引进行查询。假设我需要获取parentid等于1的所有项目。一种方法是使用IQueryableList()并获取所有文档,然后添加一个where子句以选择parentid等于1的项目。这似乎是个坏主意,因为我不能在RavenDB中使用任何索引功能。所以另一种方法是在存储库中有这样的东西,IEnumerableFind(Stringindex,Funcpredicate),但这似乎也是一个坏主意,因为它不够通用并且需要我实现这个方法,如果我从RavenDB获得更改为普通的SQL服务器。那么如何在实现通用存储库的同时仍然获得RavenDB中索引的好处呢?这篇文章很好地总结了这一切:http://novuscraft.com/blog/ravendb-and-the-repository-pattern首先,为什么要使用存储库模式?如果您想使用该模式是因为您正在进行域驱动设计,那么正如另一个答案所指出的那样,您需要重新考虑查询的意图,并将您的讨论基于您的域-您可以开始围绕它进行模拟。在这种情况下,规格可能是你的朋友,你应该调查他们。但是,在继续我的回答之前,让我们先看一下您问题的那一部分:看起来是个坏主意,因为它不够通用,如果我要从RavenDB更改为,则需要我实现此方法一个普通的SQL服务器。你正在以错误的方式解决这个问题-尝试让你的系统完全与持久性无关并在这个级别遇到麻烦-如果你试图从查询本身隐藏数据存储的独特功能那么为什么要使用RavenDB?我倾向于在简单的面向文档的情况下使用的方法(IE,就数据而言,这就是您似乎正在做的事情),是将我的查询与我的命令分开。问问自己,为什么要按父ID查询文档?它是否在页面上显示列表?你为什么要用文件模拟这个?为什么不根据视图模型对此进行建模,并使用最有效的方式从RavenDB检索此数据?(对索引进行查询(动态或其他方式)),将其粘贴在接受“一些输入”并产生“输出”的工厂中,如果您决定更改持久存储,则可以更改它。(我在我的ASP.NETMVC应用程序中更进了一步,并且有单一的动作控制器,我不称它们为控制器,在大多数情况下从中进行查询)。如果您想通过父ID实际获取您的文档以便更新它们或在它们之间运行某些业务逻辑,也许您对它们进行了错误的建模-写入操作通常只涉及更改单个文档,或者换句话说,您应该对文档建模围绕事务边界。TL;DR考虑一下您实际想要实现的目标——为什么使用“存储库模式”或“服务模式”——如果您围绕您的应用程序建模您的应用程序,这些词将作为您可能结束的目标的描述upwith模式方法作为表达对象角色的常用方式而存在——而不是你需要将你的每个功能都塞进去的东西。假设我需要获取所有parentid等于1的项目。首先,不要以这种方式考虑您的数据访问需求。您不需要“获取所有parentid等于1的项目”。尝试以这种面向数据的方式思考会有所帮助。您需要的是获取具有特定父级的所有项目。这是一个存在于您的问题空间(您的应用程序域)中的概念。这是在数据库中使用外键和名为parentid的字段建模的事实是一个实现细节。封装它,不要在整个应用程序中泄漏它。一种方法是使用IQueryableList()并获取所有文档,然后添加一个where子句以选择parentid等于1的项目。这似乎是个坏主意,因为我不能在RavenDB中使用任何索引功能。所以另一种方法是在存储库中有这样的东西,IEnumerableFind(Stringindex,Funcpredicate),但这似乎也是一个坏主意,因为两者都是坏主意。您的建议是要求调用存储库或查询的代码来了解您的架构。为什么存储库的消费者应该关心或知道存在parentid字段?如果这个改变了,如果问题空间中特定概念的定义改变了,代码中有多少地方需要改变?每个地方都可以获得具有特定父项的项目。那很糟糕,它是封装的对立面。我的观点是,您需要将查询建模为显式概念而不是传递的lambda或字符串并全部使用它们。您可以使用规范模式、存储库上的命名查询方法、查询对象模式等显式建模查询。它不够通用,如果我要从RavenDB更改为通用SQLServer,则需要我实现此方法。好吧,那个Func太笼统了。再想一想您的消费代码需要知道什么才能使用这种查询方法,您会将代码的上层直接绑定到数据库模式。此外,如果从一个存储引擎更改为另一个存储引擎,则无法避免重新实现查询,其中性能是一个足以使用存储引擎特定助手(例如,Raven中的索引)的因素。我实际上不鼓励您使用存储库模式。在大多数情况下,它会过度架构并实际上使代码更加复杂。Ayende最近发表了一些关于此的帖子:我建议只针对Raven的本机API。如果您觉得我的回答过于笼统,请列出您希望通过使用另一层抽象获得的一些好处,我们可以继续。以上就是C#学习教程:使用RavenDB实现存储库和服务模型共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
