了解企业服务

上传人:xh****66 文档编号:55817274 上传时间:2018-10-07 格式:DOC 页数:19 大小:126KB
返回 下载 相关 举报
了解企业服务_第1页
第1页 / 共19页
了解企业服务_第2页
第2页 / 共19页
了解企业服务_第3页
第3页 / 共19页
了解企业服务_第4页
第4页 / 共19页
了解企业服务_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《了解企业服务》由会员分享,可在线阅读,更多相关《了解企业服务(19页珍藏版)》请在金锄头文库上搜索。

1、了解了解 .NET 中的企业服务中的企业服务 (COM+) Shannon Pahl Microsoft Corporation 2002 年 4 月 摘要:摘要:本文提供了蕴含在 Microsoft .NET 与 COM+ 服务集成中的详细技术信息,并 介绍了可用于托管代码的服务。 COM 提供了一种编写基于组件的应用程序的方法。众所周知,编写 COM 组件需要 进行大量重复的琐碎工作。而 COM+ 并不完全是 COM 的新版本,实际上,COM+ 为 组件提供了一个服务基础结构。组件在构建后安装到 COM+ 应用程序中,可以建立易于 部署、吞吐量高、可缩放的服务器应用程序。(如果组件不需要使

2、用任何服务,则不应放 到 COM+ 应用程序中。)为了达到可缩放性和吞吐量目标,需要从一开始就使用事务、 对象池和活动语义等服务来设计应用程序。 .NET 框架提供了另一种编写基于组件的应用程序的方法,与 COM 编程模型相比, 它具有更好的工具支持、公共语言运行时 (CLR) 和更简单的编码语法等优势。COM+ 服 务基础结构可以从托管和非托管代码进行访问。非托管代码中的服务称为 COM+ 服务。 在 .NET 中,这些服务被称为企业服务。从 ServicedComponent 派生的类表明某个组件 将需要服务。(如果组件不需要使用任何服务,则不应从 ServicedComponent 派生

3、。) 改进的工具支持使编程人员能够编写基于服务器的应用程序,而可缩放性和吞吐量问题仍 需要通过良好的编程实践来实现。服务背后的基本理念是,从一开始就考虑吞吐量和可缩从一开始就考虑吞吐量和可缩 放性的设计,并利用企业服务在适当的位置轻松地实现那些设计模式。放性的设计,并利用企业服务在适当的位置轻松地实现那些设计模式。 有人可能会提出异议,服务基础结构设计实际上与 COM 甚至组件都没有多大关系: 现在,COM+ 服务可以用于 COM 组件、.NET 组件、甚至其他不能称为组件的实体,如 ASP 页或任意代码块等(请参阅 Microsoft Windows XP 上的无组件服务 COM+ 功能)

4、。 今天,所有可用的 COM+ 服务都可以用于 .NET 和 COM 对象。其中一些服务包括: 事务、对象池和构造字符串、JIT、同步、基于角色的安全性、CRM 和 BYOT 等。有关 Microsoft Windows 2000 上的服务的完整列表,请参阅 Platform SDK 中的“COM+ 提供 的服务”。Microsoft Windows XP 包括 COM+ 的一个新版本,称为 COM+ 1.5,它具有 一些附加服务,也可以用于 .NET 组件。 事务事务 为编写使用服务的托管应用程序,必须从 ServicedComponent 中派生需要服务的类, 并使用各种自定义属性来指定所

5、需的实际服务。本节介绍这些概念以及它们如何影响托管 代码的编写。后面几节将进行详细说明。 假设编写了一个 Account 类(其实际代码将在后面列出)并放置在 BankComponent 程序集中。则可以按照以下方法使用该类: BankComponent 客户端客户端using system; using BankComponent; namespace BankComponentClient class Clientpublic static int Main() Account act = new Account();act.Post(5, 100);act.Dispose();retur

6、n 0; 要建立该客户端,必须向 BankComponent 命名空间添加引用。此外,还必须为 System.EnterpriseServices 程序集添加引用 - 在 BankComponentClient 命名空间中, 客户端将调用 Dispose() 和 ServicedComponent 构造函数,它们是在 System.EnterpriseServices 中定义的方法,而不是在包含 BankComponent 的程序集中 定义的。当派生类没有重载所有基类方法时,.NET 通常要求使用这种处理方式。 BankComponent 服务器代码显示了在 .NET 中使用事务的 Accou

7、nt 类的实现。 Account 类是从 System.EnterpriseServices.ServicedComponent 类中派生的。 Transaction 属性将该类标记为需要一个事务。由于使用了 Transaction 属性,所以将自 动配置同步和 JIT 服务。AutoComplete 属性用于指定:如果在方法执行过程中出现未 处理的异常,运行时必须为该事务自动调用 SetAbort 函数,否则,将调用 SetComplete 函数。ApplicationName 属性将此程序集与为此应用程序存储服务配置数 据的 COM+ 应用程序关联起来。该类所需的进一步修改已在代码中标明。

8、 BankComponent 服务器服务器usingusing System.EnterpriseServicesSystem.EnterpriseServices; assembly: ApplicationNameApplicationName(“BankComponent“) assembly: AssemblyKeyFileAttributeAssemblyKeyFileAttribute(“Demos.snk“)namespace BankComponentServer Transaction(TransactionOption.Required)Transaction(Transa

9、ctionOption.Required)public class Account : ServicedComponentServicedComponentAutoCompleteAutoCompletepublic bool Post(int accountNum, double amount)/ 更新数据库,不必调用 SetComplete。/ 如果没有出现异常,则自动调用 SetComplete。 从 BankComponent 服务器命名空间中的代码可以看出,在 .NET 中使用 COM+ 服务是很容易的。下面简单列出了从编码到部署的整个过程: 1.编写服务器程序集。 2.建立程序集:

10、 a. 对程序集签名。可以为项目一次性地生成密钥文件,而不必为每次编译都 生成密钥文件。要创建密钥,可以在 Microsoft .NET 命令提示下使用 sn.exe:b.sn k Demos.snkc. 编译代码。必须为 System.EnterpriseServices 添加引用。 3.部署应用程序。 必须在 COM+ 目录中注册使用服务组件的程序集。ServicedComponent 类和自 定义属性是从托管代码访问 COM+ 服务的两个关键概念。服务的配置存储在 COM+ 目录中。对象在 CLR 中驻留和执行。图 1 显示了托管对象及其相关联的 COM+ 上 下文,在下面的两节中会更清

11、楚。 图图 1:与托管组件相关联的服务:与托管组件相关联的服务 使用 COM+ 组件时需要手动配置目录,而使用服务组件时,可以根据代码中的 属性来更新目录。使用命令行工具 regsvcs.exe 或通过编写访问托管 API 的脚本可 以显式注册程序集。后面的“部署”一节提供了详细的信息。在开发过程中,为方便起见, 提供了 XCopy 部署,即简单地将程序集复制到应用程序目录中。每当客户端应用程 序为从 ServicedComponent 中派生的类创建实例时,运行时都将检测是否已在 COM+ 应用程序中注册了该程序集。如果没有注册,则在本地目录中搜索程序集,如 果找到了,该程序集中所有服务组件

12、都将在 COM+ 应用程序中注册,然后激活。这 一过程称为迟缓注册,但并不适合所有情况。例如,标记为 COM+ 服务器应用程序 的程序集需要显式注册(如下所示),迟缓注册不适合调用托管服务组件的非托管客 户端。迟缓注册在开发时很有用,因为如果没有它,就需要使用脚本、代码或迟缓注册在开发时很有用,因为如果没有它,就需要使用脚本、代码或 RegSvcs 来注册程序集。来注册程序集。 4.可以将程序集放到 GAC Global Assembly Cache(全全局局程程序序集集缓缓存存 )中。 有关详细信息,请参阅“部署”一节。 5.运行客户端。 部署部署 自定义属性是从托管代码访问 COM+ 服务

13、的两个关键概念之一。自定义属性用于指 定所需的服务,如上述代码中的 Transaction 自定义属性。这些属性在程序集的元数据中 存储了服务的配置选项。自定义属性的使用方式是:让某段代码加载程序集,然后使用反 射来创建属性的实例并对其调用方法,从而提取存储在属性中的服务配置。然后,可以将 该信息写入到 COM+ 目录中。执行这些步骤和其他步骤的代码包含在 EnterpriseServices.RegistrationHelper 中。为使注册过程更简单,所有注册窗体都使 用了 EnterpriseServices.RegistrationHelper 组件。该组件可以作为托管类和 COM 对

14、象来访问。图图 2:注册服务组件:注册服务组件 从概念上讲,RegistrationHelper 执行了以下步骤: 使用 RegistrationServices.RegisterAssembly 在注册表中注册程序集。因此, 在注册表中,类是作为以托管代码编写的 COM 组件出现的,并且具有指向 mscoree.dll 的 InprocServer32 键。如果托管类没有实现任何接口,则除非使用 ClassInterfaceAttribute,否则该类的公共方法不会出现在 COM+ 目录中。这意味着, 与方法级相关联的服务配置不能存储在目录中。但是,某些 COM+ 服务可以在方法 级上进行配

15、置,并要求组件象在 COM+ 目录中显示的那样公开接口。例如,方法级 上的 COM+ 基于角色的安全性要求组件实现一个接口以配置服务。此问题将在“安全 性”一节中进行详细讨论。 使用 TypeLibConverter.ConvertAssemblyToTypeLib 从程序集生成 COM 类型库。 注册类型库。到目前为止,它与 RegAsm.exe /tlb 完全相同。 查找或创建 COM+ 应用程序。其名称是从 ApplicationName 属性、程序集 名称或所提供的应用程序的名称/GUID 中提取的。 用类型库配置使用 COM+ admin API 的 COM+ 应用程序。 检查所有自

16、定义属性,并使用 IConfigurationAttribute 将特定服务的配置数 据写入到 COM+ 目录中。 RegistrationHelper 将试图使用 RegistrationHelperTx 在事务中执行这些步骤。 RegistrationHelperTx 是在安装 .NET 时创建的 COM+ 应用程序中的一个类。因此,如 果注册失败,COM+ 目录和注册表将恢复到其原始状态。但目前,生成的类型库将仍保留 在磁盘上(或者在 GAC 中,如果程序集加载 GAC 里)。如果正在注册的程序集引用了 同样使用 COM+ 服务的其他程序集,则相关图中的所有程序集将执行上述相同的步骤。 由于 RegistrationHelper 要访问 COM+ 目录,因而需要具有计算机上的非托管代码 权限和管理权限。因此,对于 RegistrationHelper 的客户端也是一样,如迟缓注册、 RegSvcs 或您的脚本/代码。这还意味着从 Internet 上下载的代

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 科普读物

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号