`
kakac001
  • 浏览: 13130 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

请教关于domain对象注入service

阅读更多
在一个domain对象中,
注入相关的service,不知道这样的设计是好还是坏。
因为这个service是这个domain对象的某个行为不可缺少的一部分.

举个例子,
在User这么一个domain对象中,
需要有一个支付这么一个行为,暂时称它为pay
在pay的时候,需要调用相关的service来完成支付的操作.


public class A{
  private PayService payService;
  
  public void pay(){
    payService.doPay(this);
 }
}



不知道这样的设计是否存在问题..
如果有问题的话,又应该如何设计呢.
本人小菜一个,望各位大大不吝赐教
分享到:
评论
48 楼 murainwood 2009-03-19  
这种事情还是少做为好,不给自己惹麻烦是其次,更重要的是不要给别人惹麻烦
47 楼 whitez 2009-03-19  
建议楼主看看之前论坛讨论过的domainmodel的相关帖子,我觉得楼主所说的就像贫血和充血的问题,domain object和domain logic的问题。
46 楼 karlineo 2009-01-29  
其实为什么要引入Service呢?本身就必须看实际的情况。可能为了易用性,隐藏细节等等(facade,adapter),有时加一个中间层可以起到facade的作用,这种通常是application service,而对于domain service多数是分配职责的时候,找不到一个合适的实体类,才虚拟一个无状态的service出来,把职责分配给这个service,而你可以不命名为什么service。楼主这里的问题是,pay怎么是user的方法,同时又是pay service的方法呢?而你这里只是把它代理出去,难道有user的pay和没有user的pay不一样?如果pay需要调用user的数据,可以考虑把user作为参数传给pay(user)。
我个人是倾向充血的,是否好的设计只能够在实际问题当中考虑,设计本来就是循序渐进的演化,而不是一开始就定死的,所以随便就说这样耦合性增大,明显是没有理由的。不好 控制 取决于你切分边界的好坏。
本来就没有silver bullet,我只是发表一下看法。请 高手 指教。
45 楼 karlineo 2009-01-29  
我觉得很多时候pay不是user的行为,你究竟是pay什么呢?pay bill,pay order还是pay 什么其他呢?如果让我去考虑一个问题,我会先确定实体类,一开始是数据和行为结合起来的,关注于实体类的时候,先不考虑数据库,因为那个session state和persistent state的同步问题是和技术相关的(甚至用后台进程来同步)。确定职责通常都是谁有数据,谁处理。倘若这时候应用比较复杂,可能这样做会导致某些类过于大,或者层次结构过多,这时候才会考虑其他的策略,然后把某些行为代理出去或者把数据和行为分开。到最后这个职责分配给了谁?是看系统的复杂度的。但是起点都是,谁有数据,谁处理。只不过由于要综合权衡可重用性,易用性等等因素,一个原来简单的设计慢慢演化到后面变成复杂的设计,这种设计的推进导致某些职责被分配出原来那个拥有数据的类。而不会一开始设计就已经定死了pay有个pay service,专门做pay,一开始的设计怎么会知道为什么会有这个类呢?不看实际情况就按着某些分层的做法来套,往往会导致复杂度过高,而且不值得这么做。到最后由于增加了复杂度,导致晕头转向,都不知道职责怎么分配了(还怎么分而治之呢)。
44 楼 88250 2009-01-27  
厄。。。。Java 的 DDD 讨论还在持续啊- -,请 LZ 参看 从大概 05 年至今在 JavaEye 上的相关讨论,你就可以找到你问题的答案了 :-)
43 楼 抛出异常的爱 2009-01-25  
jiayouyx 写道
抛出异常的爱 写道
dmain.startTransaction();
dmain.dosomthing();
dmain.getFoo(foo);
dmain.endTransaction();

这样子写代码是不是有点傻?



DMAIN里实现了这些操作?还是引用了别的层的方法?

引用加继承
本想把代码改成这个样子.
连接池是单实例的.......

但看看也非常恶心所以就不来了.
42 楼 jiayouyx 2009-01-24  
抛出异常的爱 写道
dmain.startTransaction();
dmain.dosomthing();
dmain.getFoo(foo);
dmain.endTransaction();

这样子写代码是不是有点傻?



DMAIN里实现了这些操作?还是引用了别的层的方法?
41 楼 jiayouyx 2009-01-24  
为何要这样做?目的只有一个,做出一个可以维护的系统。好,这是我们的目的。那么我们到底怎么样去设计它,现在是我们的难题。LZ提这个问题,似乎也有点不太清楚服务层为什么需要这样做。(原因很多,分层,封装上下边界,之后在服务层内直接调用类似于API的操作 …… ……)

其实很简单啊:
LZ,你的领域逻辑是哪些?你的技术逻辑又是哪些?好,先搞清楚PAY这个操作到底属于什么。
为什么要这样设计,在服务层里直接调用DAO层的操作,目前来说DAO的设计是否合理?等等。没有DAO,不知道项目的大小和领域复杂度,光靠一个服务层基本上不能断定你的这个设计是好是坏。

大三小菜鸟。有错别把我批的太惨就行,呵呵!
40 楼 抛出异常的爱 2009-01-20  
dmain.startTransaction();
dmain.dosomthing();
dmain.getFoo(foo);
dmain.endTransaction();

这样子写代码是不是有点傻?
39 楼 pipilu 2009-01-19  
还是就楼主的疑问。我感觉自己之前的回复有些片面了。
面向对象不仅仅单纯的是:某个对象有哪些属性和行为,把这些属性和行为封装到一个类里——认为这就是面向对象了。
一个程序是否是面向对象的设计,还需要考查它是否符合:单一职责原则、开放封闭原则、依赖倒置原则等设计原则。
这说开了就太大了,我就捣一下乱吧。
38 楼 抛出异常的爱 2009-01-19  
kakac001 写道
抛出异常的爱 写道
当一个业务逻辑包含了N个表,N个DAO,N个逻辑关系
N大于5时
125种组合......
人的脑子一般是思考不过来的.
用domain封来封去....事务,边际变模糊了.......
最后都放到action里去作事务.


呵.貌似大部分人都推荐用单纯的service来做.
原本是想说pay作为User的一个行为,会更oo一些.

昨天也有就这个问题请教了下一位牛人.
是这样的看法,这个问题目前没有一个绝对的准则来说是好是坏,
各有利弊,需要自己去权衡.
作为他本人,他也是比较不倾向于充血.
也正如异常这边说的,这样的耦合性大了许多.
之后可能不好控制

呵..谢谢大家了..

前几天遇到一个问题.
需要把cookie的user用户的一些属性传到dao中去.
中间service一点没用上.
改了三个类之后恶心的厉害......
测试又没办法测,
传过去又没什么大用.
不如把内容放在用户中
把用户传到后台去
想想还是不能免俗

还真是没有dmain没办法
圆满完成这种杂技动作
37 楼 steven_cheng 2009-01-19  
zzq230 写道
其实lz讲到了一个 domain和 service如何切分的问题?
Service业务逻辑与Domain业务逻辑切分的原则
两种原则:
1. 领域模型只包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。
2. 使用Rod Johnson的”case by case”原则。可重用度高的,和domain object状态密切关联的放在domain中,可重用度低的,和domain object状态没有密切关联的放在Service中。

我觉得我同意这个说法
带持久化的逻辑还是不要放在domain object里的好
36 楼 volking 2009-01-18  
你说的domain是什么
35 楼 ayaga 2009-01-16  
我的做法是:
1.domain中只定义属性,getter,setter,所谓贫血模型。
2.在service层注入dao,对数据进行操作。
3.struts2+spring可以把action作为service层,只要自己继承一个继承自ActionSupport的父类,以后容易移植。
4.使用spring+hibernate可以写一个公共类,实现dao层是一个只有一个类的层。
34 楼 heavener 2009-01-15  
可以这样,但是软件分层就不明显了吧,你理解了并不代表团队其他人能理解。而且这样我觉得也不是很通用。可能会造成很多重复代码。重构性不是很好。
33 楼 402king 2009-01-14  
虽然大家有点烦EJB,但他里面的entity(特别是ejb3以后),和session的关系和你讲的关系有点相似哦。
实体和操作分开也是sun的选择。

说的不对的,荒淫大家拍砖
32 楼 seele 2009-01-14  
domain 当作是个体行为。。。

service 当作是群体行为。。。。

这么区分就可以了
31 楼 wuxiaoq 2009-01-13  
kakac001 写道
嗯.了解了. thx

题外话..这些“法则”有哪里有专门的介绍吗?


http://cavingdeep.cnblogs.com/archive/2004/10/28/208956.html
30 楼 zzq230 2009-01-12  
其实lz讲到了一个 domain和 service如何切分的问题?
Service业务逻辑与Domain业务逻辑切分的原则
两种原则:
1. 领域模型只包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。
2. 使用Rod Johnson的”case by case”原则。可重用度高的,和domain object状态密切关联的放在domain中,可重用度低的,和domain object状态没有密切关联的放在Service中。
29 楼 langds 2009-01-12  
建议楼主这样抽象,把pay也划一个域出去,同时也不要在user里出现pay动作。而是把pay动作放到外面的领域服务层去。
具体划分就是这样:
Payment ----依赖--->User(领域对象包内依赖,这个是内聚)

下面是从领域服务层到领域对象的依赖:
UserService--依赖--->User
PaymentService--依赖---> Payment

另外还可以出现类似这样的服务,同时依赖下层的两个领域对象:UserPaymentService --->User, Payment
这样一样层次就清楚了,行为不也内聚了吗?

欢迎拍砖

相关推荐

    领域驱动(DDD)充血模式下,domain 与 Service以及Repository的解耦---DOMAIN EVENT

    领域模型是业务逻辑的抽象表示,它包含了业务领域的实体(Entities)、值对象(Value Objects)、领域服务(Domain Services)和仓储(Repositories)等元素。在充血模式下,这些组件拥有丰富的业务逻辑,而不仅仅是...

    Domain3.6注入检测

    【标题】:“Domain3.6注入检测”通常指的是针对特定版本——Domain3.6系统进行的SQL注入或命令注入的安全检查。在网络安全中,注入攻击是黑客利用应用程序对用户输入数据的信任,向系统中注入恶意代码,以获取未经...

    Domain3.5明小子网站注入工具

    Domain3.5明小子网站注入工具正式版

    Domain对象拷贝工具类

    用于两个domain对象的拷贝,支持字段自动覆盖,选择性覆盖,选择性字段拷贝,作用:当你有多个domain对象都需要生成另外的同一个domain对象的时候这个方法就很有用了,或许存在BUG,欢迎指出

    数据库表生成domain,dao,service,controller工具

    数据库表生成domain, DAO, service, controller工具是一种高效开发辅助软件,主要针对Java Web应用程序开发。这类工具的主要目的是简化从数据库模型到应用层代码的转换过程,帮助开发者快速生成符合MVC(Model-View-...

    Domain3.6 明小子 3.6 注入 官方正版

    这里提到的"Domain3.6 明小子 3.6 注入"可能是指一个特定的安全工具或软件版本,专注于检测、预防或处理这类注入问题。"明小子"可能是一个软件品牌或开发者的名字,而"3.6"则代表该软件的第三个主要版本的第六次次要...

    Silverlight WCF RIA服务(九)Domain Service 2 源代码

    在本篇中,我们将深入探讨Silverlight中的WCF RIA(Rich Internet Application)服务,特别是关于Domain Service的第二部分源代码。WCF RIA服务是微软.NET Framework的一部分,旨在简化客户端应用程序,如...

    Define a SELinux domain for Service

    1. 在系统策略文件目录下新增ro_isn.te文件,这是定义SELinux域的主要文件,其中typero_isn,domain;声明了一个新的域类型,typero_isn_exec,exec_type,file_type;声明了该域相关的执行类型和文件类型。 2. 在...

    著名的综合注入工具Domain3.5免杀版

    【标题】:“著名的综合注入工具Domain3.5免杀版” 在网络安全领域,"Domain3.5免杀版"是一款知名的综合性SQL注入工具。这款工具主要用于测试和探测Web应用程序的安全漏洞,尤其是SQL注入漏洞。SQL注入是一种常见的...

    明小子Domain3.6

    **明小子Domain3.6**是一款专用于检测和利用SQL注入漏洞的工具,适用于网络安全研究人员和Web应用开发者,用于测试和提升网站的安全性。在IT领域,SQL注入是一种常见的网络安全威胁,通过输入恶意的SQL代码,攻击者...

    Warning! Service ro_isn needs a SELinux domain defined; please fix!.pdf

    ### SELinux权限问题详解:Service ro_isn 需要定义 SELinux Domain #### 一、背景介绍 在安卓系统中,为了确保系统的安全性与稳定性,SELinux(Security Enhanced Linux)作为一种强制访问控制机制被广泛采用。当...

    Domain3.6(很好用)

    欢迎下载Domain3.6,希望对大家有帮助 欢迎下载Domain3.6,希望对大家有帮助

    domain3.2_SQL注入漏洞扫描

    在"domain3.2_SQL注入漏洞扫描"这个主题中,我们将深入探讨SQL注入的原理、危害、检测方法以及防范措施。 SQL注入通常发生在Web应用中,当用户可以通过表单、URL参数等方式输入数据时,如果这些数据未经处理就直接...

    Domain Service, Add Service Reference

    WPF (Windows Presentaion Foundation) Application communicating with the WCF service exposed by a DomainService

    USB4 Inter-Domain Service.pdf

    《USB4 Inter-Domain Service协议》是USB Promoter Group由Apple Inc., Hewlett-Packard Inc., Intel Corporation, Microsoft Corporation, Renesas Corporation, STMicroelectronics, 和Texas Instruments等多家...

    明小子Domain3.5

    **明小子Domain3.5**是一款专为SQL注入测试设计的高效工具,它以其易用性和强大的功能在IT安全行业中受到广泛关注。SQL注入是一种常见的网络安全漏洞,攻击者可以通过输入恶意的SQL语句来获取、修改、删除数据库中的...

    oracle service_name参数

    ### Oracle Service_Name 参数详解 #### 一、概述 在Oracle数据库管理中,`service_name`是一个重要的参数,它用于标识数据库实例所提供的服务名称。通过设置正确的`service_name`,可以确保客户端应用程序能够...

    domain明小子新版

    总之,"domain明小子新版"是学习网络注入技术的优秀工具,无论是对于网络安全爱好者还是专业人士,都能从中受益,提升自己的安全防护技能。在实际使用时,建议结合其他相关资料和实践项目,以全方位提升网络安全知识...

    详细的sql注入教程

    标题和描述中提到的知识点是关于SQL注入的教程和演示文档,主要涵盖了SQL注入的基本概念、几种常用的SQL注入工具(包括啊D注入工具、NBSI注入工具、Domain注入工具)及其具体操作流程,以及PHP注入利器ZBSI。...

    controller domain service impl mapper xml 几者调用关系

    在ServiceImpl 中,我们可以看到 @Autowired 注解用于自动注入 Mapper 对象,并将其用作数据库操作。这种方式可以使得系统更加灵活和可维护。同时,我们也可以看到 @Override 注解,用于覆盖父类中的方法。 在...

Global site tag (gtag.js) - Google Analytics