论坛首页 Java企业应用论坛

请教关于domain对象注入service

浏览 16405 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-10   最后修改:2009-01-10
主要是为了分层,便于理解后后期的维护吧
0 请登录后投票
   发表时间:2009-01-10   最后修改:2009-01-10
kakac001 写道
在一个domain对象中,
注入相关的service,不知道这样的设计是好还是坏。
因为这个service是这个domain对象的某个行为不可缺少的一部分.

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


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



不知道这样的设计是否存在问题..
如果有问题的话,又应该如何设计呢.
本人小菜一个,望各位大大不吝赐教


属于User的行为肯定要定义在User中,但是为什么一定要使用service来实现它的行为呢?Service不是为domain object服务的,domain layer的service是为Application layer服务的。这个service中的doPay除了会被User调用之外难道还会被其他对象调用吗?为什么要定义成为service呢?能说一下你这个Service中的doPay()都做了些什么吗?我认为没有必要定义成为service
0 请登录后投票
   发表时间:2009-01-10  
kakac001 写道

呵 把pay封装到PayService中,pay是作为User的一个行为,至于自己的实现是怎样,
跟User应该没多大关系吧?
主要是因为pay的实现复杂了些些
所以才把它放到一个相应的service中来处理.呵


如果只是实现复杂了些,并不是把它作为一个service的理由,service是提供给Application层或者其他层次使用的;你可以使用一个接口来定义pay这个操作,如PayProcessorInterface,然后注入到User中,这样就可以了,也不需要与service耦合。作为一个domain object,本身应该不会调用到service的东西的
0 请登录后投票
   发表时间:2009-01-10  
呵.
本想说对这个问题已经心里有点数了.
没想到居然上了javaeye首页.
谢谢各位的解答.

之前可能没有描述好,再做点补充吧.

为什么要写一个payService:
因为这个PayService还依赖着其他的service.
而这些service与user并没有什么太多的联系,
如果将这些service也一起注入给user.那这个user会让人很头疼.
而且这个PayService里也有一些逻辑,以及事务.
呵,所以有了这个PayService来做个中间层.


to pipilu:

诚然,这个user似乎是承载了太多的功能.
并没有将User细分到这个程度,
算是一个“混血儿”吧  呵
0 请登录后投票
   发表时间:2009-01-12  
你完全可以做一个user对象,再做一个userService的对象。这样依赖就没问题了吧!
0 请登录后投票
   发表时间:2009-01-12  
兄弟~~你要明白为什么要注入
你注入弄反啦~~完全没有di在里面啊
0 请登录后投票
   发表时间:2009-01-12  
请问DOMAIN 对象 是什么? 我是小菜,能解释一下吗? 让我也学习一下
0 请登录后投票
   发表时间:2009-01-12   最后修改:2009-01-12
czx566 写道

    依赖顺序最好是从下到上,好像有一条法则~~~


依赖倒置原则 一种设计原则。
减少偶合(最好没有)。
还有很多设计原则 单一职责 保证自己的变化尽量少的传播
0 请登录后投票
   发表时间:2009-01-12  
是可以调用的,且不讨论你举的例子这么调用是不是合适的。在DDD中,Entity和Service实际上是同一层,因此之间有双向依赖没有什么不可的。事务控制并不是在service中控制的,而是单独在Application Service层控制的。

这样做的难点在于hibernate之类的框架不能够注射Service。
0 请登录后投票
   发表时间:2009-01-12  
建议楼主这样抽象,把pay也划一个域出去,同时也不要在user里出现pay动作。而是把pay动作放到外面的领域服务层去。
具体划分就是这样:
Payment ----依赖--->User(领域对象包内依赖,这个是内聚)

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

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

欢迎拍砖
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics