说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于状态对象与无状态对象

编辑:说三道四文库 发布时间:2018-04-27 03:00
HTML文档下载 WORD文档下载 PDF文档下载
各位大侠:
在MTS/COM+多层开发中,根据书面上理解,状态对象是指其属性值会影响其方法的行为,而无状态对象则不会,即对象池中的无状态对象可以相互替代,但有状态对象则不行.但书本上只浅说使用状态对象必须将其属性值保存起来,并在再一次调用时对其属性值进行恢复,可否举例子说明一下,如何保存与恢复有状态对象的属性值呢?
非常感谢!
顶……
这个问题比较复杂。简单的举个例子,假设某具备状态的加法服务对象包含一个接口:
IStatefulSum = interface
  procedure SetX(const Value: integer);
  procedure SetY(const Value: integer);
  function sum: integer;
end;
调用前两个方法设置X、Y属性的值,然后调用第3个方法计算其和。如果是无状态服务则会被合并成
IStatefulSum = interface
  function sum(const X, Y: integer): integer;
end;

我们讨论状态对象,两个用户A、B登录后获得各自的SessionID ID_A、ID_B。为了能够在调用之间区别方法所设置的X、Y是那个用户设置的,我们可能会设计这样一个表:
-------------------------------
UserID     Value_X      Value_Y
-------------------------------
当某用户调用SetX/Y方法的时候,需要在代码中写数据库,比如A调用SetX(3),然后B调用SetX(4),B再调用SetY(9),A又调用SetY(11),数据库内容如下:
-------------------------------
UserID     Value_X      Value_Y
-------------------------------
ID_A       3            11
ID_B       4            9

则当用户调用Sum方法的时候,代码应该搜索数据库,找到对应用户ID的X、Y数值,加和返回。

如果不是这样设计,而是直接在对象中存储X、Y属性,则前面的用户设置的X、Y数值会被最后一个用户设置的值所代替,导致计算出错。

这就是保存属性值的意思,属于称之为状态的持久化。其实不只是状态对象,无状态对象也经常使用持久化技术存储一些重要数据。
手误,“属于称之为状态的持久化”应为“术语称为状态的持久化”
谢谢,请问Session ID是在什么时候分配的?又在什么时候释放?
是不是客户端创建对象的时候?接口设为nil的时候?
那如果是操作状态对象的话,接口指针就一直都要保存着?对吧?
也就是说创建对象之后得到的接口指针就代表了Session ID ,重新创建得到的又是另一个ID,对吗?
SessionID的问题超出了原来问题的范围,打个比方,如果你可以通过IP地址来区别A、B两个用户,那么IP地址就可以作为SessionID,它在这里只是用于唯一标识两个不同用户的代号。又好比在ASP中的session对象,也是一样的东西。
如果将属性有效的持久化,接口指针可以按需创建。
当然前提是要在客户和持久化的属性之间建立起一一映射关系,这已经超出了问题原本的范围了。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘