我已经研究了几个试图遵循DDD原则的应用程序,我注意到我们最终遇到了服务层和感觉像代码味道的存储库之间存在重复的情况.

对于服务层中的大多数操作,它似乎是直接映射到CRUD操作,GetAll,GetById,创建,删除等.架构流程在这些行中:我有一个控制器调用服务层调用一个调用ORM的存储库,它与后端进行通信.

因此,例如GetAll将存在于SL和Repository中.现在,如果我们有一个变更/业务要求,GetAll应该忽略某些项目,我应该怎么做,我应该忽略存储库中的这些,还是应该进入服务层的业务逻辑?如果我们只是让服务层直接调用ORM,那么生活会不会更容易?

总结一下:我理解服务层可以抽象一些业务逻辑,但是在大多数情况下 – 它处理简单的CRUD操作,是不是更容易摆脱存储库?但是,如果SL还包含一些具有复杂业务逻辑的方法,那么它们应该通过存储库吗?从良好的设计角度来看,我是否应该支持一致性并始终通过存储库或只是保持简单,只使用存储库,而不是简单的一对一映射到CRUD操作.

PS:我发现似乎有类似的问题,但没有找到任何令人满意的答案

解决方法

I noticed that we end up with situations where there is duplication
between the Service Layer and the repositories that feels like a code
smell.

它不是代码味道,因为它们做不同的事情.

您应该记住,域或应用程序服务驻留在与存储库实现不同的层中.层是有原因的 – 不同层中的对象不具有相同的职责,也不与相同的邻居交谈.存储库实现与对象持久性的方式紧密耦合.他们可能会生成sql语句并与关系数据库交谈,他们可能会与您的ORM交谈……重要的是他们知道对象的持久化方式,而Application Services则不然.

如果您的服务层要直接调用ORM,它实际上会做两件大事,违反单一责任原则.将ORM更改为另一个ORM或使用不同的持久性方法也会更加困难.

So for example GetAll would exist in both SL and Repository. Now,if
we have a change/business requirement that GetAll should ignore
certain items,how am I supposed to do it,should I ignore these in
the repository,or that’s business logic that should go in the Service
Layer?

如果GetAll()忽略某些项目,我强烈建议在服务和存储库中重命名它以反映它,例如:GetAllAllowedToUser(),GetAllBut …().因此,方法的合同将是明确的,你将避免误解它应该返回什么.另外,您将能够保留原始的正版GetAll()方法,这种方法仍然有用.

c# – DDD – 服务层和存储库之间的重复的更多相关文章

  1. DDD框架落地实战

    这篇文章主要为大家介绍了DDD框架落地实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. zend-framework – DataMapper模式是否打破了MVC?

    我一直在阅读多个PHP框架,特别是Zend框架,但我对前进的正确方法感到困惑.ZendFramework不使用ActiveRecords,而是使用表数据网关和行数据网关模式,并使用DataMapper将行数据网关的内容映射到模型,因为ActiveRecord在模型没有1时发生故障:1映射到数据库表.Zend快速入门指南中有一个exampleofthis.对我来说,他们的例子看起来非常臃肿,到处都是

  3. ubuntu14.04 安装 ddd 以及运行 ddd 遇到的问题

    1.安装ddd遇到的问题1.ubuntu下可以直接sudoapt-getinstallddd即可.2.源码安装时,首先下载ddd最新的源码,http://ftp.gnu.org/gnu/ddd/,一般的过程如下1).在./configure过程中遇到如下错误提示解决方法:sudoapt-getinstalllibmotif-devlibmotif-common注意,不同的linux版本可能moti

  4. centos ddd 安装,注意版本

    开始安装,问题很多,后来发现是版本太旧,用了下边的版本就可以了:1.下载DDD源码:http://ftp.gnu.org/gnu/ddd/.现在的最新版本:ddd-3.3.12.tar.gz2.解压缩源码:tarxzfddd-3.3.12.tar.gz3.进入ddd-3.3.12目录,运行./configure报错:configure:error:TheMotifincludefile'Xm/Xm

  5. Ubuntu16.04下安装DDDData Display Debugger

    第一步,下载安装包并解压我们可以从http://ftp.gnu.org/gnu/ddd/下载我们需要的版本,我下载的是最新版本ddd-3.3.12.tar.gz#wgethttp://ftp.gnu.org/gnu/ddd/ddd-3.3.12.tar.gz#tarzxvfddd-3.3.12.tar.gz#cdddd-3.3.12/注意:解压时我们可以解压到任何地方。第二步,配置#./configure--prefix=/usr/local/ddd执行完这个后我们一般会遇到两个问题:第一个错误提示出现这

  6. java – DDD实体及其标识符

    我的系统中有一个实体,它自然需要一个标识符,以便可以唯一标识.假设数据库用于使用Hibernate生成标识符,使用本机策略,那么显然应用程序代码没有分配标识符的可靠性.现在,该实体的实例在被持久化并获取其标识符之前是否可以被认为是有效的?

  7. c# – 在DDD方法中,这个例子是否正确建模?

    刚刚创建了一个acc在SO上问这个:)假设这个简化的例子:构建一个Web应用程序来管理项目…

  8. c# – 实现域驱动设计

    有人使用域驱动设计技术吗?我最近阅读了埃里克·埃文斯的同名书,并且有兴趣听到任何在项目中实现全部/部分内容的人我已经把这个问题开放了,我想尽可能多地看到意见,但我有几个问题:1–如果语言支持,值类型是真实的“值类型”吗?例如C#中的一个结构2-C#中有什么功能可以使语言和模型之间的关联更加清晰解决方法是!我在项目中使用DDD(但是I’mbiased!“领域驱动”方面,还是实施方面?

  9. c# – DDD – 服务层和存储库之间的重复

    如果我们只是让服务层直接调用ORM,那么生活会不会更容易?但是,如果SL还包含一些具有复杂业务逻辑的方法,那么它们应该通过存储库吗?

  10. c# – 工厂模式这应该存在于DDD中?

    我已经讨论了一段时间了,但仍然没有得出结论.虽然我看到大多数示例都在应用程序层中有工厂代码,但我倾向于认为它应该在域层中.原因:我有时会在我的工厂进行初始验证,我希望所有对象的创建都能通过.我希望此代码可用于我的对象的所有实例化.有时,操作需要感觉不自然的参数信息传递给构造函数.还有一些不那么重要的原因.有没有理由说这是一种不好的做法?

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部