`
jamesby
  • 浏览: 383415 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于Service调用Service 的思考

    博客分类:
  • Java
阅读更多
以前做软件都是随便写几个Service,纯粹为了Service而Service,当某天突然发现我的两个Service竟然需要互相访问,于是乎开始考虑如何设计Service,特别是Service之间的依赖关系如何设计的问题,因此偶认为软件Service层的设计应该重点放在两个方面:
一是Service 功能划分的设计;二是Service 与 Service 之间的依赖关系的设计。
其中,Service与Service之间依赖关系的设计又分如下几种:

一是继承关系依赖
    public class ObjectA extends ObjectB{
    }

二是属性关系依赖
    public class OjbectA{
       private ObjectB b;
       public void setB(ObjectB b){
          this.b = b;
       } 
       public void method(){
          b.abc();
       }
    }


三是参数方法参数关系依赖
    public class ObjectA{
       public void method(ObjectB b){
           b.abc();
       }
   }


大家对Spring已经很熟悉了,相信前两种大家用的很多,第三种在开源框架用的比较多.
分享到:
评论
9 楼 jamesby 2007-03-06  
moshalanye 写道
   (个人意见和经验)继承最好不要用,因为偶合性太强,一般依赖关系存在的话的也只能是单向依赖,
尽量将平级的组建在设计的时候就简单设计成为依赖关系的,一但平级的关系变少,组建相互依赖的可能就被最大的降低了(相互依赖形成构造的死循环)。
    同时也最好是定模块的时候把关系比较近的表操作定义在一个模块里面,再在这个模块里在这些表操做的基础上去封装该模块的不同业务service(从而形成有多个service的组建,提供该模块的业务api),每个业务都可以拥有同模块的所有的表操作对象作为DB功能对象(DAO对象实现),这样做就可以利用DAO层和业务层减少平级的依赖。
    当然在这种情况下还是会出现依赖,但这个时候的依赖就是组建的依赖问题了,基础组建(例如对多个关于员工的表提取各种不同的员工信息的组建,log组建,email组建,总之是经常会被很多模块用到对于项目很通用的通用模块组建)被级别更高更上层的组建所依赖,并形成新的功能组建,这样一来依赖关系变的清晰。
恩,在一般的设计中几乎也就用到这些,依赖取决于该组建的通用性,象楼上说的邮件,log等可能是比较通用的,还有例如目前我的系统中有寻呼系统,短信系统,这些可能都是被依赖的Service,如果在一个系统中有这些功能,可以简单的设计他们的依赖关系,如果是多个系统都有类似功能,怎么办?

一是将这些被依赖的东西打包成一个通用的组件,
二是将其设计成一个通用的服务,如通过EJB或者webservice实现.

但是问题扩展成如下程度就好了,比如我设计的是一个简单的框架,与数据库什么的都没有关系,也没有什么所谓的Service,如spring的代码.

这时候在设计的时候怎么考虑对象之间的各种依赖关系.当然这个问题好象很大.


8 楼 moshalanye 2007-03-06  
   (个人意见和经验)继承最好不要用,因为偶合性太强,一般依赖关系存在的话的也只能是单向依赖,
尽量将平级的组建在设计的时候就简单设计成为依赖关系的,一但平级的关系变少,组建相互依赖的可能就被最大的降低了(相互依赖形成构造的死循环)。
    同时也最好是定模块的时候把关系比较近的表操作定义在一个模块里面,再在这个模块里在这些表操做的基础上去封装该模块的不同业务service(从而形成有多个service的组建,提供该模块的业务api),每个业务都可以拥有同模块的所有的表操作对象作为DB功能对象(DAO对象实现),这样做就可以利用DAO层和业务层减少平级的依赖。
    当然在这种情况下还是会出现依赖,但这个时候的依赖就是组建的依赖问题了,基础组建(例如对多个关于员工的表提取各种不同的员工信息的组建,log组建,email组建,总之是经常会被很多模块用到对于项目很通用的通用模块组建)被级别更高更上层的组建所依赖,并形成新的功能组建,这样一来依赖关系变的清晰。
7 楼 jamesby 2007-03-06  
caoyangx 写道
有些时候,如果两个service间互相调用,很容易出现A调B,B调A的情况,这样如果使用springIOC管理的话,会报一个错误。避免这样的事情发生,就需要写一个baseXXXservcie的抽象service,把公用部分进行继承使用,这样就可以解决,类似你的第一种行为,但是不是A继承B。
是的,关键是我想更深层次的讨论
如对象什么情况应该使用属性依赖
什么情况应该继承.
什么情况应该使用回调.
什么情况一个对象应该作为另一个对象的方法参数来传递.
准备研究下设计模式的各个协作对象之间的关系是通过哪种方式.
6 楼 caoyangx 2007-03-06  
有些时候,如果两个service间互相调用,很容易出现A调B,B调A的情况,这样如果使用springIOC管理的话,会报一个错误。避免这样的事情发生,就需要写一个baseXXXservcie的抽象service,把公用部分进行继承使用,这样就可以解决,类似你的第一种行为,但是不是A继承B。
5 楼 jamesby 2007-02-24  
andyandyandy 写道
为什么在service层内还要互相调用呢?
似乎把需要多个类调用的东西抽象出去更好吧!
是啊,是因为我设计的不合理,其实根本就没有设计,才引发上面的思考!
4 楼 andyandyandy 2007-02-24  
为什么在service层内还要互相调用呢?
似乎把需要多个类调用的东西抽象出去更好吧!
3 楼 jamesby 2007-02-24  
忽略了一个问题,那就是依赖关系是有方向的,下面的代码均假设Class A 调用 Class B,即依赖关系的方向是A-->B。

依赖关系的继承实现方式

方式一

public class A extends B{
   public void methoda(){
      /**
      *代码段1
      */
      methodb();
      /**
      *代码段2
      */     
   }
}

public class B{
	public void methodb(){
	    /**
	    *methodb的代码
	    */	
	}
}


方式二

public class A extends B{
   public void methoda1(){
      /**
      *代码段1
      */
   }
   public void methoda2(){
      /**
      *代码段2
      */     
   }
}

public class B{
	public void methodb(){
	    methoda1();
	    /**
	    *methodb的代码
	    */
	    methoda2();
	}
	
	public void methoda1(){}
	public void methoda2(){}
}


这个实际上不就是template设计模式嘛!

依赖关系基于属性的实现方式

方式一

public class A{
   private B b;
   public void methoda(){
      /**
      *代码段1
      */
      b.methodb();
      /**
      *代码段2
      */     
   }
}

public class B{
	public void methodb(){
	    /**
	    *methodb的代码
	    */	
	}
}


好象没有方式二

依赖关系基于方法参数的实现方式

方式一

public class A{
   public void methoda(B b){
      /**
      *代码段1
      */
      b.methodb();
      /**
      *代码段2
      */     
   }
}

public class B{
	public void methodb(){
	    /**
	    *methodb的代码
	    */	
	}
}


方式二

public class A{
   public void methoda1(){
      /**
      *代码段1
      */
   }
   public void methoda2(){
      /**
      *代码段2
      */     
   }
}

public class B{
	public void methodb(A a){
	    a.methoda1();
	    /**
	    *methodb的代码
	    */
	    a.methoda2();
	}
}


这个好象是传说中的回调.

通过以上代码又引出一个新的问题,在设计Service的时候除了考虑功能,依赖关系外,还要考虑依赖关系的调用方式是主动调用方式还是被动调用方式?

例如上面代码的方式二均采用被动调用方式,即依赖方向是A-->B,但是调用方向确是从B-->A.
2 楼 jamesby 2007-02-24  
为什么我回复了以后帖子排在前面,但是对回复修改后就排到后面去了?
1 楼 jamesby 2007-02-24  
大家平时都怎么用,我一般采用第二种方案,第三种几乎不用,
大家也可以延伸到接口的继承、属性依赖和方法依赖的设计,
希望大家多提写自己的想法.

相关推荐

    Android实验五.doc

    1. **stopService()**:适用于startService()启动的Service,调用此方法可停止Service。 2. **onUnbind()**:当所有客户端(通过bindService()绑定的Activity)都解除绑定后,系统会调用此方法,标志着Service可以被...

    RESTful Web Service 课件下载.pdf

    RESTful Web服务不仅是一种架构模式,更是一种思考分布式应用和服务的方式。它通过简单、标准的HTTP协议实现了资源的管理和交互,从而提高了应用的灵活性和可扩展性。随着技术的发展,REST已成为构建现代Web应用和...

    android面试题

    `startService()`启动的服务即使调用者退出,服务依然运行,多次调用只会多次执行`onStartCommand()`,但不会重复创建Service。而`bindService()`则将服务与调用者绑定,调用者退出服务也会终止。 - 停止Service: ...

    百度地图毕业设计源码-think-about-backend-develop:对项目组后端开发的思考

    必须由controller调用service,service调用repository,service和repository可调用framework内容。 从设计模式来看,属于SOA,以service为核心,虽然实际开发中大量的业务逻辑泄露到controller和repository中(甚至...

    DubboCloudNative之路的实践与思考.ppt

    《Dubbo Cloud Native之路的实践与思考》 随着云计算的发展,Cloud Native已成为现代应用程序构建的主流方式。Cloud Native技术使得企业能够在公有云、私有云以及混合云环境中构建和运行可扩展的应用程序。其中,...

    通过axis使用网上天气预报服务的demo

    - **创建Call对象**:通过`service.createCall()`方法创建了一个Call对象,该对象用于执行具体的调用操作。 - **设置调用属性**:设置目标服务地址、操作名称(即方法名)、参数信息以及返回值类型。 - **设置SOAP...

    dubbo-kubernetes:Apache Dubbo与k8s集成

    初步思考 kubernetes是天然可作为微服务的地址注册中心,类似于zookeeper、Consul。 具体来说,kubernetes中的Pod是对于应用的运行实例,Pod的被调度部署/启停都会调用API-Server的服务来保持其状态到ETCD;...

    Android架构师手册_建模与图形思考_高焕堂_2012_06_Part03x

    - 如果服务绑定成功,则继续执行“callService”(调用远程服务)活动。 - 如果服务绑定失败,则进入失败处理流程。 4. **callService**:表示成功绑定后调用远程服务的操作。 5. **流程结束**:无论是成功还是...

    2.2.2 云原生go-zero微服务框架设计思考@万俊峰.pdf

    云原生go-zero微服务框架设计思考是由万俊峰Kevin分享的关于go-zero微服务框架的设计原则和实现细节的报告。本报告涵盖了go-zero的设计原则、架构选型、微服务代码生成工具goctl、通用API定义规范、缓存设计、服务...

    Android架构师手册_建模与图形思考_03

    若成功,则流程转向“callService”活动,即调用远程服务;若失败,则可能导向其他补救措施或直接结束流程。 ### 控制流与决策 控制流在活动图中起到了至关重要的作用,它不仅连接了各个活动节点,还通过决策节点...

    制造业企业中台建设思考与实践.pdf

    中台则更侧重于前台的敏捷性,将后台业务能力和数据通过模型聚合到中台,通过Service API供前台调用,以适应快速变化的业务需求。与SOA/ESB相比,中台更注重业务迭代和数据分析能力,同时在成本和效率上更具优势。 ...

    Java高级玩法-SPI的基本使用

    SPI的全称是Service Provider Interface,是Java提供的可用于第三方实现和扩展的机制,通过该机制,我们可以实现解耦,SPI接口方负责定义和提供默认实现,SPI调用方可以按需扩展 API的全称是Application ...

    阿里巴巴中台技术架构实践与思考5 .pdf

    阿里巴巴的中台技术架构实践与思考是其在数字化转型过程中的重要成果,旨在提升组织协同效率、研发效率,以及业务的快速响应能力。这一架构的核心是通过构建业务中台和中台技术支撑平台,实现技术拓宽商业边界和业务...

    ANDROID实习总结报告模板.pdf

    7. **Android开发实践**:在实习期间,实习生参与了实际项目开发,通过完成一系列任务,深化了对Android编程的理解,锻炼了独立思考和解决问题的能力。他们学会了按照软件工程步骤进行程序设计,包括需求调研、资料...

    亮剑.NET深入体验与实战精要2

    7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动...

    亮剑.NET深入体验与实战精要3

    7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动...

    Android应用开发记录-字幕播放器(3)工程包

    本项目"Android应用开发记录-字幕播放器(3)工程包"专注于使用`Service`来实现音频播放功能,结合了`MediaPlayer`和`Proxy`技术。下面将详细解析这些知识点。 首先,`Android Service`是Android系统中的一种组件,...

    面向服务体系架构和业务组件的思考.docx

    ### 面向服务体系架构和业务组件的思考 #### 一、引言 随着信息技术的飞速发展,软件系统的复杂性日益增加,企业对于高效、灵活的IT解决方案的需求也越来越迫切。面向服务体系架构(Service-Oriented Architecture...

Global site tag (gtag.js) - Google Analytics