假设某公司有若干个主要由ASP.net构建的系统(包括网站——如果把网站也看成是系统的话),每个系统都实现与公司某方面业务相关的功能。比如库存商品维护,员工信息维护,企业网站,日常报表,发货单打印与维护等等等。这些系统彼此之间相对独立,但企业的核心数据都集中保存在1-2个SQL Server数据库中。问题是,如果架构能够有效地应对业务逻辑的变更,比如当定价策略发生变化时,相应的系统(比如网站上的产品介绍,发货单打印,库存商品信息)尽可能不做修改,而应对此类变化。简单说,就是如何在各系统中只实现界面呈现,而将几乎所有的业务逻辑封装到一起,供各个子系统调用。我想到的两个方案:
方案1.建立一个公共类库,将Entity,Data Access Layer, Business Logic Layer都封装到这个类库里,各个子系统中只引用这些类库。这样做虽然可以将业务逻辑集中,但带来的问题也不小:
  i)     业务逻辑的变更很可能导致函数的参数类型发生变化,如果函数的参数发生变化,还是需要更新每个系统中相应的代码;
  ii)    即使参数不做修改,只有函数内部得逻辑发生变化,那么每次核心类库重新编译过后,各个子系统还是要重新编译。或者至少要将编译过后的核心类库dll重新部署到各个子系统的Web服务器上的bin目录中,对于同时运行几十个系统的状况来说,很不可取方案2. 建立一整套WebService,所有业务对象的数据和操作通过WebService完成。这种想法貌似比方案1好些,但也有问题:
  i)    还是参数变化的问题,如果参数变化,作为调用Webservice的各个系统依然需要更新调用Webservice的代码
  ii)   Webservice在大量数据(如几百条以上记录的表)和不能很好地序列化的数据类型面前有些力不从心。不知道有没有朋友面临同样的问题,有什么办法解决。欢迎交流探讨。

解决方案 »

  1.   

    谢谢菜鸟,喜欢你的"coding直到80"的信心和勇气。
      

  2.   

    方案1
    是不是可以配置参数,写在xml或数据库
      

  3.   

    不太明白楼上的意思。比如,在核心类库中存在这样的定义,通过客户类型来返回对应的报价:
    Class Item
      Public Shared Function ItemPrice( _
          ByVal CustomerType As String _
          ) As Decimal
        ......
      End Funtion
    End Class 
    某天企业定价策略变了,不单单考虑客户类型,还要考虑客户所在的地域,那么核心类库需要改变/抑或重载为:
    Public Item
      Public Shared Function ItemPrice( _
          ByVal CustomerType As String, _
          ByVal Location As String) As Decimal
        ......
      End Funtion
    End Function那么,在所有子系统中,以前返回价格的代码类似Item.ItemPrice("102C")都要相应地变成Item.ItemPrice("102C", "BEIJING")我要面对的不是参数值的变化,而是参数类型或数量的变化。
      

  4.   

     还是参数变化的问题,如果参数变化,作为调用Webservice的各个系统依然需要更新调用Webservice的代码
    ===========
    你的意思是说客户端随着ws的改变得重新改变了?如果这样的话,那必须重新编译各个客户端了。
    如果只变服务端,可考虑重载之类的
      

  5.   

     ii)  Webservice在大量数据(如几百条以上记录的表)和不能很好地序列化的数据类型面前有些力不从心。 
    ======
    WCF 不知道会不会好点,没测试过.但传输的数据量可以设置的。
      

  6.   

    回复你的方案二的几个问题:我们可以看看Windows的api,几十年不变。你的api方法有windows的多么?有它变化快吗?学微软就没有错了,保证已经发布的接口一直可以使用,发布新的版本之前进行足够的测试!企业系统为什么要分布?因为客户端根本不可能拥有服务。那么,把什么什么业务逻辑封装在DLL中并且编译到各个客户端程序中,这无需去讨论,没意义。明确这个,那么web服务是不是“力不从心”,就要看你是否是从成熟的系统的角度去看了。
      

  7.   

    参数变化不是问题..
    两个方案都有可取之处.看实际开发
    多个子系统多个DLL.动某一个DLL不会影响其它子系统..
    主要看你自己的对整个的架构是否清晰..WEB服务..你可以说数据量大的时候慢..但你真正用到的时候可能就和数据量没有关系了..
      

  8.   

    方案1.建立一个公共类库,将Entity,Data Access Layer, Business Logic Layer都封装到这个类库里,各个子系统中只引用这些类库。这样做虽然可以将业务逻辑集中,但带来的问题也不小: 能不用web service ,就不要用它。
      

  9.   

    谢谢楼上几位的回答,百家争鸣的确有助于让思路清晰。目前我的感觉是封装到类库的做法的确有些得不偿失,而应对Webservice的变化,或者说封装变化,统一接口的确是很理想的方案。仍然会让人比较困惑的是,企业已经既有大量的应用,每天的对这些系统的维护是必然之举。在这种情况下,企业比较容易接受的是Change AS It Goes,就是随着每天的维护工作逐渐建立起一个个的Service,经过不断地迭代实现从无到有,从少到多,从幼稚到成熟的过程。而在这样的开发过程中,要保持接口的稳定不变是很有挑战的。那么各位有没有在这样的处境下探索发展SOA的成功经验或建议。抑或甩出一些比较优秀的SOA框架?
      

  10.   

    说到SOA,现时已经成为最热门的话题之一。
    像你所说到的大型企业系统设计,框架是最重要与最先考虑的问题。其中接口与虚拟类的运用是十分重要。
    你必须先确定框架的结构,然后再设计实现类型。而像你所说的参数类型,参数个数的变化应该尽量避免。如果真的要转变的话,则可应用 WEB SERVCIE来解决问题。(现今Ajax技术中正提倡面向服务设计)
    比如说在客户端是调用 http://.../*.asmx?Id=0来获取数据,使数据以XML或JOSN方式传递。则它不需要理会服务器部分是应用什么方式来取得数据。
    这样,则可实现业务层与表现层的分离。在你服务器系统架构发生改变时,避免页面重新设计。特别是你所说企业系统已经超越ASP.NET,而应该以“分布式编程”的形式去完成的。这时候这个SOA好处特别明显。
      

  11.   


    之所有我推荐类库接口,是因为web service是跨进程的,调试起来一定没有本地的类库来得方便。其实类库和web service对于接口的变更的工作量是一样的,但整体来说,web service的工作量会大一些。
      

  12.   

    这个变化应该是必然的,接口就是为了变化,如果接口变了,系统想不做改动恐怕很困难吧。
    比如说现在计算机的usb接口改变了,那么可想而知。
      

  13.   

    我现在做的这套系统 就是基于webservices的分布式 把业务逻辑都封装在服务器
    重点是在客户端定义好自己的接口
      

  14.   

    我的看法:
    方案一的做法, 其实是把所有系统都集合为一个系统了, 而你这个集合起来的"大"系统又是分开安装到若干台服务器或者目录中, 情况比较复杂, 是会面对重新发布DLL的问题; 我觉得方案二的思路反而可以参考, 不过不是说WebService可取. 
    你的系统是完成各自的业务, 所以不能等同把它们看做一个大系统, 而是互相配合的若干系统, 这样你的难度会降低一些. 系统之间可以考虑类似WebService进行数据交换,毕竟各个系统之间进行百万级别的数据同步, 可能性还是小一些(主要是考虑数据是同步修改的, A系统的数据修改即时通知B系统进行更改).
    其实, 还是系统架构中对于业务功能的划分问题, 而不是简单的发布DLL的问题.
      

  15.   

    这个方面我也是个菜鸟,所以也就说说我的看法吧。
    对于你说的问题确实是个比较棘手的。现在大家都对soa的解决方案有着很深的认识,但是不知道你们有没有想过soa的解决方案前提是系统的高度的集成和松耦性。
    webservice有优点那是在调用服务方面,但是依据你当前的系统给人的感觉是不合适宜的。与其那样,倒不如把系统中不同业务做成接口,然后来调用,这样兴许能解决问题,就好像金融行业的解决方案ieee一样。这个也只是我的想法,如有不对的地方还请大家指正。
      

  16.   

    demiwolf, “soa的解决方案前提是系统的高度的集成和松耦性”,其实我反而认为高度集成和松耦是SOA追求的目标。倘若系统已经高度集成并且耦合度较低,那么SOA存在的意义又是什么呢。