实现客户端
当一个基于
CLR
组件服务类被编译和部署,你就需要在客户端调用它。长远来看,组件服务类没什么特别之处
;
事实是使用
COM+
运行时服务是不相关的。
这个代码展示了简单类早期的定义
MyTxCfgClass:
using ESExample;
public class Client
{
public static void Main(string[] args)
{
MyTxCfgClass tcc = new MyTxCfgClass();
... // use object as desired
}
}
当然,与所有的
CLR
代码,客户端必须引用组件服务类程序集。
csc /r:ESExample.dll Client.cs
细微的复杂性
这里你会看到,服务类通过
.NET CLR
实现
COM+
是相当的容易。
System.EnterpriseServices
命名空间里的类提供了可以使用
COM+
运行时服务的
API
。运行时服务本身没什么改变;他们工作的方式还是
COM+
开发者熟知的。已经说了,
集成
COM+
和
CLR
没有涉及到如此细微的复杂性。
有几个问题是使得使用
CLR
语言写
COM+
代码比我刚才提到的复杂的多。
有些问题会产生,因为
CLR
毕竟不是
COM
,
因为它可以做
COM
做不到的事情。这些问题是不能解决的
;
你只要知道如何
CLR
的特性如静态方法和垃圾回收器
如何影响
COM+
编程。
再学习这些问题前,你必须知道 CLR 的类和 and COM+ 上下文环境的关系。 首先,调用继承自 ServicedComponent 的类的实例都会被 COM+ 上下文环境边界侦听。这些对象称为上下文环境边界。调用没继承自 ServicedComponent 的类的实例就不会被上下文环境边界侦听。 这些对象称为 context-agile 。 CLR 对象默认就是 context-agile 。 当你继承自 ServicedComponent 它们会变成 context-bound 。 ( 这个与 .NET remoting 上下文环境没有关系,我下面会讲到。 ) 图 9 说明的这个架构
再学习这些问题前,你必须知道 CLR 的类和 and COM+ 上下文环境的关系。 首先,调用继承自 ServicedComponent 的类的实例都会被 COM+ 上下文环境边界侦听。这些对象称为上下文环境边界。调用没继承自 ServicedComponent 的类的实例就不会被上下文环境边界侦听。 这些对象称为 context-agile 。 CLR 对象默认就是 context-agile 。 当你继承自 ServicedComponent 它们会变成 context-bound 。 ( 这个与 .NET remoting 上下文环境没有关系,我下面会讲到。 ) 图 9 说明的这个架构
图
9
上下文环境对象
非常有趣的是 CLR 对象可以实现类似 COM 对象和 COM+ 上下文环境交互这样的行为。通过 COM ,调用对象通常默认都会被侦听 ; 所有的对象都是 context-bound 。 COM 对象是 context-agile 只有当它聚集了 freethreaded marshaler (FTM) 且不是第一个在 COM+ 上下文环境里 被创建的对象 ( 因为它不是可识别的对象 ) , 这样情况下,调用不会被侦听。 新方法确保调用真的需要的时候被预处理和迟处理的好处是减少了侦听负荷。 特别地,如果组件服务类的实例返回了一个非组件服务类的实例 ( 例如一个 ADO.NET DataSet 对象 ) ,这个调用不会被侦听。 并且 DataSet 对象不需要做任何事情,它就是照常工作。
第二个你应该知道的事情是,
除了减少真正需要的交叉上下文侦听外,
CLR/COM+
集成尽可能地避免了托管类型和自有类型间的转换。
来自托管的
CLR
代码到
COM
的调用是比较昂贵的。重要的部分就是类型的前后转换
—
大部分在
CLR strings
和
COM BSTRs
之间。
请求穿过
COM+
环境边界需要
调用一些固有的代码,
组件已经相当聪明可以避免同样来自
CLR
且处在同一进程里的调用者和被调用者之间的类型转换。
或许有一天所有的
COM+
运行时服务都会用
CLR
语言重新实现,调转就不成问题了。
那时不管如何,这个优化都会使得
COM+
侦听更加快速。
静态方法和属性
现在你知道了
CLR
代码如何关联上下文环境,
思考这个问题:如果一个基于
CLR
组件服务类
包括静态方法和属性访问器,
它将在什么上下文里执行呢?答案是调用者。
这个看起来不是很直观,
但是它确实很有意义当你想静态成员不是对象定义且不许要在对象驻留的上下文里访问。例如,组件服务类在
图 10
有个静态方法,
2
,
和静态属性,
4
。这个代码会在调用者的上下文里执行。
调用实例的方法
1
,
或者属性
3
,通常在对象的上下文里执行。
这时你或许想知道当你在属性里保存了一个对象的静态引用且你想在另外一个上下问里引用会发生什么事情。基于 COM 的 COM+ 编程里, 在被成为静态属性的全局变量里保存了一个原始的对象引用, 会导致严重的错误因为你不可以把对象不加包装地从原来的上下文里带走。使用基于 CLR COM+ 代码, 这个就不是一个问题。 CLR 使用相当瘦的代理包装了每个组件服务类的实例子这样其它上下问的对象就不需要保留对象的直接引用。如果代码在一个保留基于 CLR 组件服务类引用在静态属性的的上下文执行。它实际保留的是一个引用。如果另一个上下文里的代码要通过静态属性访问它, 特定的代理就发现变化而且封装它自己保留的引用这样侦听就触发了。这个是有个优美的解决方案,本质上你可以任何地方保存基于 CLR 服务类的实例并且都会正确触发。
|
||
相关文章
:
Windows XP: Make Your Components More Robust with COM+ 1.5 Innovations House of COM: Migrating Native Code to the.NET CLR the "samples"technologies"component 服务 subdirectory of the.NET Framework SDK 事务 al COM+: Building 可伸缩的应用系统 by Tim Ewald (Addison-Wesley, 2001) |
||
作者
Tim Ewald
: DevelopMento
的首席科学家,
最近出版的
事务性
COM+:
创建可伸缩的应用系统
(Addison-Wesley
,
2001)
的作者
|
来自
10
月
2001
的
MSDN
杂志
本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/321005,如需转载请自行联系原作者