生活就是一个谜

Life is just an Enigma, simple and complicated.
posts - 12, comments - 1, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2006年6月20日

       经过前面的研讨之后,奖SOA框架付诸开发,由于项目时间比较近张,因此选择了在五一期间加班赶工实现了该框架,并且开发过程中调整了一些细节,毕竟设计和开发还是有一定的偏差。最终除了服务管理功能尚未实现,其他都实现了。
       在开发过程修改后,WebService服务端调整成需要发布成SOA的远程方法依旧按照WebService来开发,即用WebMethod属性标记该方法,但该WebService必须实现DataSet CallServiceMethod(DataSet)。CallServiceMethod方法用于根据参数来反射调用本WebService类的其他方法。
       使用效果:本次项目主要是OA的开发,本OA定位于企业整合平台为主方向的OA,力求该OA系统和其他系统耦合性非常低,能够将任意第三方数据进行OA的审核,另外还有门户信息发布平台、权限系统、单点登陆等,这几个系统力求独立运行,互相不依赖,但是信息却是互相共享的。比如这些网站只要登陆任何其中一个后,访问其他网站则不需再登陆;比如任其它业务站点都可以往信息发布平台发布数据;比如权限系统为其他所有业务系统提供校验服务等等。SOA很好的解决了这些问题。由于目前数据量比较小,因此性能上尚未表现出劣势。其优势前面也分析过,这些系统任何一个升级改造,只要保持发布的WebService方法能够满足业务的要求,其他系统均可轻松调整配置文件即可适应其变化。
        当然,在本次项目开发中,由于所有系统都是自己人员开发的,因此其WebService方法基本已经确定,反而显得每个调用WebService的其他业务系统都要开发相应的Client类有点累赘。
        在使用过程中,也发现另外一个问题。在AOP的实现过程中,我们使用了System.Runtiome.Remoting.Messaging.LogicalCallContext.SetData(string,object)的方法来保存上下文共享对象,并且该上下位共享对象的名字是写死的,这就导致了一定问题。如果多人访问,会不会造成别人拿到的上下文对象不是自己保存的呢?目前这方面还没有详细测试,但我想肯定会有问题的。当然这个问题需要解决还是比较容易的,可以通过由外面传递一个标记用户的参数进来,用该参数标记上下文对象即可,因此不伤大雅。

posted @ 2006-06-20 09:14 都市骆驼 阅读(211) 评论(0) 编辑

2006年5月11日

 

下面开始介绍.NET2003下,如何利用反射、AOP、以及ASMX实现SOA

一、实现机制

.NET2003ASMX框架提供了Web Service 反射功能,如果按照平常的引用Web ServiceIDE会自动生成一个Reference .cs文件的东西,里面实现了所引用的Web Service的反射调用类。其实我们可以自己来定义自己的反射类,来实现动态调用Web Service。比如直接建立一个类似Reference.cs文件的类,将里面的Web Service地址(服务地址)等当作参数传入(如虚线所示),实现动态绑定Web Service。然而有几个地方需要注意的:由于用了反射,每个Web Service方法的映射必须提供方法名、参数序列以及返回结果类型,特别是要考虑通用性时就得非常小心处理。但是,我们也应看到这个方案的优点,试想一下,各个系统提供的业务服务千差万别,服务地址、方法名、参数序列和返回结果都不可能相同,居于此方案,使该反射类能够尽可能的包含了各种业务方法的情况,从而实现反射的稳定性和适应性。

业务服务管理系统

WSMng

业务系统A

业务系统B

业务系统XXX

映射类

WS

WS

映射类

WS

映射类

2

首先要考虑的是,必须为各个业务系统统一Web Service命名空间(该命名空间和类的命名空间含义是不一样的,可以参考MSDN帮助文档),在发布Web Service时,可以通过System.Web.Services.WebService属性来制定命名空间。对于一个开发商来说,当然能够自己定义自己的命名空间,这也不是什么难事,因此在规划面向服务结构体系时,应统一服务命名空间。对于不同的开发商来说,那就没办法了,只好为每个开发商来映射,当然这也是情理之中。

定义了服务的命名空间,则在反射类在反射Web Service方法的时候就方便多了。我们假设本公司统一定义面向服务体系结构的所有Web Service命名空间都为Company.WebService(此命名空间在映射类中需要用于描述http头,用于定位WebService,比如基于此命名空间,Company.WebService/GetServiceData则映射到方法GetServiceData,亦即SOAPAction定位),并开发和部署该Web Service服务。那么下面我们就应该考虑服务方法的实现了。

 

二、服务方法定义

接着考虑为服务方法定规范。由于服务方法必须要能够通用,因此方法名是必须预先定义的,而且只有一个;返回结果用最通用的DataSet返回,参数序列我们也用DataSet来传输。为什么要考虑定义一个唯一的服务方法,因为在反射机制之中,每一个方法的反射都必须提供方法名和参数列,如果业务方法很多而且不断的扩展,那么反射类也必须相应的修改,这使得通用性、维护性上变得非常差,不可能因为每上一个系统都要修改以前系统的代码来重新反射新的业务服务。为什么考虑DataSet,因为DataSet最容易封装和序列化,同时输出XML也非常容易,为了以后扩展成XML通讯十分便利。

假设当前Web Service服务xxx.asmx有如下的方法:DataSet  CallServiceMethod (DataSet),用于获取当前服务业务的所有功能;DataSet GetServiceDetail()则是将当前有关业务方法(Web Service方法,而是Web Service需要调用的其他业务方法)的信息按照规范提供出去,这些规范预先定义好的。因为Web Service的主要方法只有CallServiceMethod,所以只能通过参数的不同在后台用不同的业务方法处理,而参数和这些具体业务方法也必须能建立相应的对应关系。接下来的关键,就是要提供一个能够解释输出结果、参数序列的机制。注意,当其他业务系统需要用到当前业务系统的服务时,它必须利用已开发的反射类来调用,并且将当前服务的地址传入(动态调用,图2所示)

业务系统A WS: xxx.asmx

M1业务方法

M2业务方法

M3业务方法

CallServiceMethod方法

GetServiceDetail方法

3

由于实际应用中,输出结果和参数的变化性比较大,可能是基本数据类型,也可能是数组、结构、对象等等,因此我们要对输出结果和参数要定一个说明书。说明书的DataSet(含结果DataTable和参数DataTable描述)将会解释了输出结果的所有信息结构,并能保障别的系统能拿到该说明书就知道用什么内容的参数调用CallServiceMethod,输出的结果是怎么样的,包含了什么,并能够转换成实际类型的结果。

为什么要用这种规范和对应关系,主要是为了考虑业务系统的后期绑定,开发时可以不用考虑最终的实现到底使用哪个Web Service,在实际应用的时候才配置绑定,虽然这个绑定需要手工配置(后面会详细解释),但对于业务的独立来说,仍然有价值。

 

三、说明文档获取方法定义

下面讨论这方法参数和返回结果两个规范的问题,也就是如何定义和解释这个说明书DataSet:含参数DataTable(可能多个)和结果DataTable。这些数据都通过GetServiceDetail()方法来获取。

首先,我们预先定义好规范。规范的说明文档记录方式:WSURL、明书DataSetWSURL用于定位远程方法CallServiceMethod所在的WebService服务地址;参数DataTable用于记录该WS服务具体的业务方法,主要字段有MethodNameParameterNameParameterTypeParameterValueDescription;结果DataTable记录每个业务方法的返回结果的数据结构,主要字段有MethodNameResultTypeResultValueDescription。在业务服务管理系统之中,相应的有一个存储规范的数据表,数据表保存URL和这个明书DataSetXML描述,并且提供获取规范的方法(也是WS服务方法)。每个业务子系统(比如A)都需要在发布的时候调用该方法(GetServiceDetail方法实现) 获取规范信息,并用规范信息来解释业务子系统并形成说明文档,然后将说明文档发布到业务服务管理系统之中。或者通过业务服务管理系统自动询查注册在线的各个系统的说明文档。

业务服务管理系统WSMng

业务系统A  WS: xxx.asmx

DataSet GetServiceDetail()

说明文档管理

发布说明文档

PublishServiceDetail(WSMngURL)

GetMethodDetail (当前服务类))

4

DataSet GetlMethodDetail(typeof(当前服务类))将获取当前服务所有业务方法的规范文档的整理,该方法利用自定义属性和映射的机制来收集当前服务的各个方法参数信息、结果信息,并封装成说明文档DataSet(包含含参数DataTable和结果DataTable)返回。

假设A系统有M1M2M3三个业务方法分别为:DataSet M1(DataSet Pa, int Pb)bool M2(String,String)void M3(),则说明文档DataSet应该如下:

方法的的参数表:MethodDetail

MethodName

ParameterName

ParameterType

ParameterValue

Description

M1

Pa

DataSet

 

 

M1

Pb

int

 

 

M2

Pa

String

 

 

M2

Pb

String

 

 

M3

 

 

 

 

其中Mn表示实际的业务方法,如图3所示。

 

结果表:ResultDetSail

MethodName

ResultType

ResultValue

ResultDescription

M1

DataSet

 

 

M2

bool

 

 

M3

void

 

 

说明书的传递方式,我们可以用一个固定的服务方法传递,比如DataSet GetServiceDetail(),该方法返回当前Web Service服务所有方法的说明(包括结果、参数)

 

四、服务方法实现

好,接下来介绍如何通过WS服务方法调用业务方法。

业务子系统WS服务方法DataSet CallServiceMethod (DataSet)用于实现调用业务方法过程。要理解的是,WS只发布了WebMethodCallServiceMethod,为什么没有发布其他业务方法,请参照第二节服务方法定义。服务方法基本上就是将参数DataSet按照自身的参数说明文档解释成实际的参数,再根据这些实际的参数进行相关的业务操作,然后将业务操作的结果按照结果说明封装成结果DataSet输出。

业务系统A WS: xxx.asmx

参数PramDataSet

DataSet CallServiceMethod (PramDataSet)

M1

M2

M3

DataSet CallMethod(typeof(当前服务类), PramDataSet)

5

其中DataSet CallMethod(typeof(当前服务类),DataSet)将实际的参数转换,并能根据参数DataSet调用真正的业务方法(M1~M3),将结果按照规范封装输出。

其调用过程实际用了反射的原理,因为参数已经提供了方法名、方法的参数内容,所以利用反射可以调用相应的方法。

XXX.asmx实现代码片断:

……

         [Nontriv.Attribute.WebService.ServiceMethod]

         public System.Data.DataSet M1(System.Data.DataSet Pa, int Pb)

         {

              ……

              return ds;

         }

         [WebMethod]

         public System.Data.DataSet CallServiceMethod(System.Data.DataSet parameter)

         {

              Nontriv.WebService.Reference.Criterion criterion=new Criterion();

              return criterion.CallMethod(typeof(WebServiceTest),parameter);            

         }

……

其中WebserviceMethod为自定义属性,标记该方法为Webservice的业务方法。Criterion为规范文档类,用于收集当前WS类的有WebserviceMethod自定义属性的方法详细信息,并提供CallMethod方法调用业务方法。

五、服务管理系统

Now,我们已经实现了一个业务服务系统的基本功能,已经包含了如何制定服务,将服务发布到服务器,如何接收参数和返回结果。

下面讨论一下服务管理器如何实现管理这些服务,并能够很方便的给别的系统查询和配置。

和服务管理系统相关的最重要的就是说明文档管理系统了,其实这个说明文档管理也是一个WebService服务,不过由于这个服务比较特殊,没有涉及到客户的业务,因此这个服务是固定的,而且服务的方法也是固定的。

业务服务管理系统WSMng: xxx.asmx

QueryWS(WSURL)

AddOrUpdateWS(WSURL, DataSet)

其他管理

业务系统A WSxxx.asmx

GetServiceDetail

PublishServiceDetail

说明文档包含了各个注册业务服务的规范说明,包括WS地址、包含方法参数和结果的说明文档DataSet。其主要功能是提供查询,便于配置本地方法和WS业务服务方法对应,同时还为以后执行一些任务式的调用作准备。比如可以让业务服务管理系统定时调用某个业务服务的某个方法。

发布到服务管理器有两条途径,一是通过在服务管理系统中输入业务服务WS的地址,系统将自动询查业务服务系统的所有业务方法及输出结果的说明;另外一种就是业务系统输入服务器地址,业务系统将自动将自己的说明注册到服务器。这辆条路径都需要人工操作,目前还无法实现自动询查和注册,主要还要考虑路由等,比较难实现。

 

六、调用服务和接受服务结果

最后考虑如何接收服务以及处理服务返回的结果。

调用方和服务方类似,也就是将参数通过将调用参数说明构造成DataSet,然后调用DataSet CallServiceMethod (DataSet),再利用结果说明将结果解释出来。注意的是,这里的CallServiceMethod是本地对远程WS的反射类,记得前面我们介绍过,WS的反射必须方法名字、参数序列等必须要一致。

在些调用WebService业务方法时,必须要准备这两项重要工作:获取到映射类,用于将WebService类映射到本地类,并通过动态配置WSURL来实现动态调用业务服务;AOP面向方面框架,用于捕获本地方法调用参数,并将这些参数提取出来,并用于映射类调用远程服务方法时所需的参数拟定;和服务方一样,也需要一个能够获取到本地方法的说明文档,这些说明文档表示了哪些方法需要调用远程方法,以便后期可以根据这些信息来绑定具体的WS方法。

参数对应配置,由本地配置并保存在本地XML中。保存字段主要有:WSURLWebService业务方法及参数序列、本地方法及参数序列。这个配置过程,是由手工配置的。可以通过在业务管理系统中查出WebService以及其说明文档,用户再根据本地开发时的调用方法的参数文档进行一一配对。

 

举个开发例子。

比如在开发某业务系统时,我们需要用到权限验证,在权限验证的方法中,我们实现如下:

     [Nontriv.WebService.AOP.WSAOP]  

     public class ClientOfWS:Nontriv.WebService.AOP.WSCountexBoundObject

     {

         [Nontriv.Attribute.WebService.ClientMethod]

         public bool HaveQX(string Name,string qx)

         {

              return (bool)reflect.GetData(this.GetParamDS());

         }

     }

WS服务实现有点类似,其中Nontriv.WebService.AOP.WSAOP表示该类自定义了属性,也表示了该类实现了AOP框架(继承了Nontriv.WebService.AOP.WSCountexBoundObject)。

由于使用了AOP框架,方法在调用时捕捉到实际的调用参数,并根据说明文档格式将参数转换成DataSet(包含了含参数DataTable和结果DataTable),如果参数是DataSet,则将该DataSet的数据表一一拆离,并复制到说明文档的DataSet之中,并标记它是属于哪一个参数的。这些参数信息,我们用this.GetParamDS()来获取,有点像获取当前上下文对象的信息,不过这里面的实现是结合了AOP框架,使用了Remoting的上下文消息监听机制。

HaveQX方法的实现,我们只用了WS映射类的一个固定方法GetData,此方法封装了之前我们讨论的CallServiceMethod方法(asxm的反射方法,用于反射远程WebserviceCallServiceMethod方法),由于CallServiceMethod返回的是一个封装了结果的DataSet,因此GetData方法还需对结果进行转换。另外,此方法还根据配置情况对实际参数进行转换,后面会介绍怎么转换。

this.GetParamDS()得到的数据大概如下(DataSet数据结构参见规范及说明描述)

MethoDetail表:

MethodName

ParameterName

ParameterType

ParameterValue

Description

HaveQX

Name

string

实际的值

 

HaveQX

qx

string

实际的值

 

ResultDetail表:

MethodName

ResultType

ResultValue

Description

HaveQX

bool

 

 

假设我们需要将本地方法HaveQX和前面所定义的远程方法M2绑定,配置文件如下:

<PrmDataSet>

 <PrmDataTable>

    <LocalMethodName>HaveQX</LocalMethodName>

    <LocalMethodPrm>Name,qx</LocalMethodPrm>

    <WSURL>http://……/XXX.asmx</WSURL>

    <WSMethodName>M2</WSMethodName>

    <WSMethodPrm>Pa,Pb</WSMethodPrm>

 </PrmDataTable>

</PrmDataSet>

这个配置文件表示本地方法HaveQX调用了某个WebService业务方法M2,在调用过程中,将HaveQX的参数Name传给M2Pa,将HaveQX的参数qx传给M2Pb。配置过程的大概是通过配置页面进行配置的,具体做法大概是用户得到了业务服务管理系统的注册服务信息,将它们列出来,用户经过选择并配置到本地的业务系统方法之中。

经过上面配置后,则反射类的GetData方法会跟据这个说明文档将参数转换成如下参数数据:

MethoDetail表:

MethodName

ParameterName

ParameterType

ParameterValue

Description

M2

Pa

string

Name实际的值

 

M2

Pb

string

qx实际的值

 

ResultDetail表:

MethodName

ResultType

ResultValue

Description

HaveQX

bool

 

本地调用方法的参数传送到远程WSCallServiceMethod方法之后,CallServiceMethod调用了 CallMethod该方法根据参数表调用具体的业务方法,并将结果填充到ResultDetail表。如果返回结果是DataSet,类似的也会将DataSet里面的表拆离并复制到CallMethod返回结果的DataSet之中。

之后的事情就是将这个结果返回给客户端,再由客户端根据结果类型来转换远程所返回的DataSet里面的内容。

 

综上所述,本文已经从各个方面描述了WebService实现SOA平台的基本功能,但也有一些缺陷在里面:规范定义和说明文档并不能描述得了所有参数类型和返回结果,特别是DataSet的情况。在实际的处理DataSet,基本上都是需要知道列的信息,而本文并没有好办法通过规范和说明并无法描述列的信息(包括列信息的映射和数据的映射)。此外对于非序列化的数据也不能很好的支持,比如参数或者结果如果是ArrayListHashTable的情况下,则无法传送。

此外本平台的实现肯定还有很多劣势,其中关于AOP的实现就不是很理想,需要利用到.NETRemoting消息监听机制。另外对于传大数据来说,本平台还是显得不适合。

但其优势我们还是可以一一道出,对于简单业务方法,我们这方面的封装还是有优势,特别是解决了系统与系统、组件与组件的依赖降低问题,系统的松耦合使得业务系统的扩展灵活和互影响降到最低,另外如果在服务管理系统植入了流程管理系统,则企业级的业务流整合平台还是能够在一定程度上实现。这个话题,以后会慢慢探讨并付诸实现。

posted @ 2006-05-11 14:02 都市骆驼 阅读(289) 评论(0) 编辑

  系统间互相独立,和本系统不相关的业务操作均通过Web Service服务来实现,为了未来的通用性、易维护、以及扩展等因素考虑,各个系统间的Web Service服务必须定下一个通用的数据交换规范。

实现的目的大概是这样,提供一个业务服务管理系统,里面记录了各个业务系统的Web Service服务地址、调用方式和返回结果;任何需要获取其他业务服务的系统,都提供一个配置管理器,可以直接从管理系统搜索并配置所需的业务服务。

就如114台查询一样,比如114台登记并管理了各种业务公司的电话号(服务地址)以及业务服务范围(服务内容和服务方式),任何一个客户如果想得到某个公司的服务,可以向114台搜索并选择自己需要的服务公司及服务内容(这个就是配置过程)。之后的业务活动,用户便可直接和提供服务的公司进行交互(传递服务方式参数,服务公司“调用”实际的业务服务过程,并返回服务结果)

业务服务管理系统

WSMng

业务系统A

业务系统B

业务系统XXX

1

从上面看来,整个过程有两方面功能:接收别的业务系统服务,提供本系统的业务服务。

假设服务管理系统为WSMng,业务系统有AB,可能有更多业务系统XXX,那么A系统在开发的时候,实现接收服务(蓝色线所示)和提供服务(红色线所示)的功能。后面会详细解释如何实现这些功能。绿色线表示服务规范配置信息传递,蓝色线表示最终调用关系。为什么要规范服务配置信息呢?

接收别的业务系统服务必须考虑别的系统所提供的服务方法、本系统所需传送的参数序列以及返回结果;提供服务则是个反过程,需要考虑本身能提供的服务方法、接受的参数序列和输出的结果。如上图所示,假设A系统需要某个服务方法,在最终部署的时候,A系统只知道这个方法的返回类型和调用参数,比如DataSet A.MA(int prma1,string prma2),假设B系统提供了某个方法DataSet Mb(int prmb1 string prmb2),其返回类型和调用参数恰好和A系统所需的相同,那么配置就非常简单,只需描述其对应关系即可,即:本地方法MA,参数序列prma1,prma2;远程方法Mb,参数序列均为prmb1,prmb2。假设C系统也有一个方法DataSet Mc(string prmc1,int prmc2),起所示实现的功能也恰好是A系统所需的,只不过参数序列有所不同,那么就可以配置信息如下:本地方法MA,参数序列prma1,prma2,远程方法Mc,参数序列prmc2,prmc1。也就是说,配置信息必须描述了本地方法和远程方法一一对应的信息。

就如现实生活中,你想要的服务,可能很多公司都有,只不过每个公司实现该服务的所需条件不一样。假设你能提供的条件也有很多,那么你如何活得一个公司的服务?肯定会发生这个事情,就是你必须将你的条件和该公司的服务条件一一匹对,当条件满足之后,该公司才执行服务过程。这个匹对的过程,就需要一个规范来定义(在现实中,至少服务公司也需要你填个表什么的),这个规范所起到的作用,就是解释供求双方对服务要求的细节。

总的来说,如何定制服务方法、参数序列和结果的规范是必须的。

这个平台有什么好处?

SOA平台,应当最大限度的降低系统与系统之间的依赖,提高系统间信息的共享度。比如权限系统,该系统功能比较单一,无非就是人员信息、权限信息等的管理,但这些信息几乎所有别的系统都需要,也就是说,别的系统应该和权限系统尽可能的降低依赖,而权限系统尽可能的共享信息,所有权限校验的服务,都可以通过统一的接口来获取。

在信息不断的建设过程中,可能权限系统还会不断的升级,但如果保持服务的接口不变,都是WebService,而且方法也固定,那么最多就是配置一下对应关系的规范文档即可立即使用另外一套权限系统。

类似的,各种各样的业务系统之间的信息共享,也需要这样一个非常松耦合的平台,才使得任何业务的纷繁变化也不至于影响别的系统,却能确保信息最大共享。

posted @ 2006-05-11 13:59 都市骆驼 阅读(94) 评论(0) 编辑

2006年5月10日

       前一段时间在Wayfarer的Blog拜读了《在.Net中关于AOP的实现》,十分兴奋。但在现实使用中,还是有点遗憾,主要表现为:通过该AOP框架,虽然我们能够在业务方法利用Remoting技术,在消息传递的过程中利用监听来获取得到方法的详细信息,但无法获取的到该方法所对应的上下文对象。这也和我对Remoting不是很熟悉有关吧。
        后来查看了一下Remoting方面的东西,发现如果需要获取该上下文对象,还必须将对象通过RemotingConfiguration.RegisterWellKnownServiceType()来发布到服务器,然后可以通过Activactor.GetObject()来获取远程对象。虽然我们也可以通过透明代理对象来反射获取,并在消息截获的时候来获取得到该对象,但是这让人犯难了,耦合性太高。客户端总不可能老依赖远程对象所对应的类。
        试想一下,假设业务方法需要权限校验,并且根据权限校验的结果来进行业务处理,如果权限校验失败则执行某代码,如果成功则执行另外一些代码。那么客户端依然要依赖权限校验的类,否则怎么反射,怎么获取的到校验的结果。
        后来我又查阅了一下MSDN相关的文档,发现Dharma Shukla,Simon Fell,和 Chris Sells写了一片文章,用来解决如何共享这些上下文对象。该文章标题为《Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse》,请注意该文章最后几段的描述,一下引用原文:
“…….NET provides an extensible call context that we can make use of to allow a method. For example, we can allow an object wrapped in our call-tracing aspect to have the ability to add things to the stream of trace messages by putting ourselves into the .NET context, as you can see here:
internal class CallTracingAspect : IMessageSink {
public static string ContextName {
get { return "CallTrace" ; }
}

private void Preprocess(IMessage msg) {
•••
// set us up in the call context
call.LogicalCallContext.SetData(ContextName, this);
}
•••
}
Once we've added the aspect to the call context, the method can pull us out again and participate in the tracing:
[CallTracingAttribute()]
public class TraceMe : ContextBoundObject {
public int ReturnFive(String s) {
Object obj =
CallContext.GetData(CallTracingAspect.ContextName) ;
CallTracingAspect aspect = (CallTracingAspect)obj ;
aspect.Trace("Inside MethodCall");
return 5;
}

       很幸运,我们可以通过IMethodMessage.LogicalCallContext.SetData(string,object)来将需要共享的上下文对象保存起来,客户端可以通过Object obj =System.Runtime.Remoting.Messaging.CallContext.GetData(string) 来获取所共享的上下文对象。
       因此我们可以通过设计模式来定义一个结果类,在权限校验的时候,将结果封装并保存起来,客户端获取到改结果之后再强制转换成结果类,通过结果类进行判断校验结果,从而进行其他业务处理。
这样一来,起码也解决了上下文对象无从获取的问题。也不失是一个好方发啊。

posted @ 2006-05-10 19:20 都市骆驼 阅读(268) 评论(0) 编辑

2006年5月2日

  什么是SOA?
面向服务体系结构,下一代软件的体系结构。
将软件的各个独立业务子系统显式地构建成“服务”。
共享的是业务,而不是类。
面向的是服务,而不是功能。
开发的是平台,而不是组件。
各子系统系统可用不同的语言编写,运行在不同的运行环境,仅通过精心定义的XML接口互相交互。
尽管SOA!=WebService,但是目前有比WebService更好的办法来实现么?

posted @ 2006-05-02 18:27 都市骆驼 阅读(105) 评论(0) 编辑

      信息化建设越来越成熟,但由于过去的建设手段,软件开发手段不尽相同,技术手段、开发理念也参差不齐,面向过程、面向对象、COMCORBA、组件化种种技术,软件系统也有产品式、项目式等,然而很多这些技术和项目,都是解决一个方面的问题,这对于我们这个社会主义社会结构、各行各业的业务结构来说,都只能解决某个局限的问题。社会是不断进步和发展的,业务也是一样,其中的种种关系千丝万缕,等你回头一看,你就会发现原来我们很多东西只做了其一,还有更多东西原先并没有考虑到。
    简单说个例子。人员/权限系统大家都做过,而且还可能每个业务系统都做过。但实际上,在现实的社会结构中,某个单位的人员/权限系统本来就不复杂,张三只有一个,李四也只有一个,张三在A业务的权限只有一套,在B业务的权限也只有一套。哪为什么就不能统一一套权限系统,里面记录张三在AB业务系统的权限,或者未来更多的XX业务系统的权限,并为这些系统提供权限校验服务?或者是否我们一开始就只认为,我开发A系统的时候,只考虑A业务,谁管他B还是XX业务的东西。如果现在还是这样子考虑问题,那你就too naive, too out了!
   
面向服务,更趋向于将业务结构抽象化,而不是简单的对象抽象化。天气预报、权限查询都同样是一种业务性很专一的系统,单和这业务相关的其他业务却千千万万,如何更好的抽象这些业务,使之更好的为过去、现在、将来的系统作出自己最大的效益,那就得用面向服务的思想来指导我们的问题考虑。
    现在实现面向服务的技术也越来越多,然而最让人关注的还是WebService,尽管SOA!=WebService。随着微软的Indigo推出,我想SOA在微软框架下的实现也越来越成熟,越来越有效率。
    未来会是一个什么样的软件结构呢?对,卖的就是平台;面向的就是服务。软件越来越趋于社会描述,对社会的体现也越来越成熟,而不再是简单的一个个对象的抽象和实例化。试想一下,以后的所有信息处理,都有可能被别人实现和共享,而你要做的,就是怎么样合理利用者些信息去处理你自己的业务。当然这个伟大的理想,恐怕不是一两年就能实现。但我想未来的信息化,应该无处不在,服务无处不在,你可以在你办公室的电脑桌面屏幕摆下你家里的信息收集(冰箱运行情况、监视器运行情况)、你需要处理的公文信息、天气预报……,还可以设定当天气为下雨时,你家里的窗户会自动关闭。

    美好的世界,SOA,面向服务,面向社会! 

posted @ 2006-05-02 18:24 都市骆驼 阅读(149) 评论(1) 编辑

2006年4月20日

    第一次面试别人,感慨万分。
    自从公司走了几个技术骨干,软件部可以说几乎到了生死攸关的地步,虽然我不是管理层,但对人才紧缺十分了解。没了技术骨干,处处感觉到苍白。
    说起来有点遗憾,管理层依然看重管理方面的人才,而我看重技术方面的人才。因此在招聘之前,双方有点激烈的谈论了招聘的方向,最后定为两个管理方面的人才和一个技术人才。令我有点失望的是,管理层过多过少有点天才论的感觉,十分看重第一印象,而且似乎这个印象会影响很大。我认为不能一眼就认定一个人的所有,人总会变的。然而面试也只有一个小时不到的时间,应聘者的表现,似乎也只能是一眼所见。……这是题外话了。
    招聘的地点是省的重点大学,面试一共6位,其中一个女的研究生最后决定不来面试,剩下5位,这5位学生应该都是该学校非常优秀的。面试时一共考核几个方面:交流能力、组织能力、学习能力、技术能力、性格等。最后决定录取3个。
    管理层的第一印象,是一个这样的人A:交流非常不错,大概是做学校的计算机技术协会技术部长的缘故;组织能力也不错,能带领几个人作毕业设计;学习能力也可以,成绩优良;技术能力一般;性格开朗中等。
    我的第一印象,是一个技术人才B,B的特点:学习面广、自学能力强、执着、有创新意识,而且在技术方面交流十分畅通,但是他没有真正做过一个项目,基本上都是帮别人解决问题,半途参与一些小项目。不过他的执着却成了管理层的顾忌,认为如果以后招进来了可能很难协调,比如如果安排他做一个项目,可能技术方面他会太专著而不顾大局。但我认为作为学生,专著和学习能力是非常重要的,特别是作为技术人才。
    另外一个C:交流能力和组织能力最突出,而其他的都一般。不过也很合适管理层的口味,认为是个项目管理的人才。
    
    至此,虽然还没能即刻能分得出最终谁才是我们最需要的,但是也说明了几个问题。目前的大学生就业会面临这些问题:
    1、交流能力不能少,否则出来工作就很难适应和同事、客户在各方面开展工作。面试时有一个应聘者学习、技术能力都不错,但是说起话来却口吃,也不知道是紧张还是本来就口吃。遗憾,当场被我们否决。
    2、学习能力和创新意识很关键。如果一个人不能体现自己的学习能力,哪工作中千变万化的需求,包括技术,如何能面对?创新意识有时候用来解决一些关键问题,哪怕是你自己发明什么代码生成器、图像分析器、设计模式的优缺点分析,都能体现这个问题。试想如果让你独当一面,没有创新能力,如何能够解决别人从未发现的问题。成绩有时候能体现一个人的学习能力,所以还是不要以为在学校的成绩不重要。当然如果你的成绩真的很差,那么你就的在你课外所学的东西来体现。
    3、组织能力,管理者最喜欢的了。。。虽然我认为这个能力是可以后期弥补的,但是第一印象如果决定了别人的看法,你就不能不考虑它的严重性。无论怎么样,即便是组织你的舍友做一个小项目或者组织一个社会活动,也能体现。对于大多数大学生来说,组织的机会是很少的,但只要你去想,机会还是有的。
    4、至于性格,普遍认为内向的人还是不受欢迎,除非你是个非常NB的技术人才。

posted @ 2006-04-20 19:00 都市骆驼 阅读(109) 评论(0) 编辑

2006年4月19日

posted @ 2006-04-19 17:21 都市骆驼 阅读(58) 评论(0) 编辑

2006年2月27日

posted @ 2006-02-27 13:36 都市骆驼 阅读(98) 评论(0) 编辑

posted @ 2006-02-27 13:09 都市骆驼 阅读(50) 评论(0) 编辑