第2章 对象激活上下文-对象激活

对象激活主要包括

  • 构造字符串
  • 及时激活
  • 对象池
  • 私有组件

     

1.构造字符串

服务器苏建只能使用默认的构造函数,这样在对象创建的时候你就不能通过构造函数初始化数据.但是你可以使用构造字符串实现类似的功能,只是每次实例化的时候都只能使用相同的构造字符串.系统管理员可以改变构造字符串.(比如用到配置数据库的连接字符串).

通过[ConstructionEnabled]特性和其Default属性把默认的构造字符串添加到配置元数据中.在类内部你必须重写基类SericedComponent的Construct方法.当每次创建对象时,这种方法会被COM+基础结构调用.

2.即时激活(Just-in-Time Activation JITA)

JITA是一个用于减少服务器负载的特性.对于打开lJITA支持的组件,他的生命周期和他使用的客户端应用程序无关.这个服务器组件自己通过设置完成位来决定对象什么时候应该被终止.如果客户应用程序通过客户端的同一个引用来调用一个对象的方法,而这个对象在服务器端已经被终止的话,一个新的对象会被自动创建并激活.

JITA是通过设置[JustInTimeActiveation]来启用的.

要使用JITA,必须重写两个基类ServicedComponent的方法:Activate和Deactive.当对象生成后Activate方法会被运行时自动调用.当对象终止前Deactive方法会被自动调用.

为组件设置完成的两种方法:

  • [AutoComplate]
  • 设置ContextUtil的静态属性DeactivateOnReturn为True.

3.对象池

对象池对于那种初始化过程很长的对象(比如,连接到一个老系统的服务器,或创建一个复杂的矩阵以进行数学运算)是个有用的服务.如果调用方法所需要的时间少于创建所需要的时间,应该考虑对象池技术.

对象的初始化过程在客户端第一次使用它之前进行:在应用程序启动后,为对象池设定的最小的对象就会被创建和初始化.

4.私有组件

私有组件是COM+1.5带来的新特性之一.被标记为[PrivateComplent]特性的组件只能由应用程序内部的对象激活,客户端应用程序不行.

  1using System;
  2using System.EnterpriseServices;
  3using System.Xml;
  4using System.Globalization;
  5using System.IO;
  6
  7
  8namespace Demo.Introduction
  9{
 10    [ObjectPooling(true,100,1000)]
 11    [JustInTimeActivation]
 12    [ConstructionEnabled(Default = @"C:\Temp\")]
 13    [EventTrackingEnabled]
 14    public class CoursesComponent : ServicedComponent, ICourseOrder
 15    {
 16        private string path;
 17
 18        public CoursesComponent() { }
 19
 20        protected override void Construct(string s)
 21        {
 22            path = s;
 23        }
 24
 25        ICourseOrder 成员#region ICourseOrder 成员
 26        [AutoComplete]
 27        public void Order(string xmlOrder)
 28        {
 29            CreateFile();
 30            XmlDocument doc = new XmlDocument();
 31            doc.LoadXml(xmlOrder);
 32            XmlNodeList courses = doc.GetElementsByTagName("Course");
 33            foreach (XmlNode nodeCourse in courses)
 34            {
 35                XmlElement xmlCourse = nodeCourse as XmlElement;
 36                if (xmlCourse != null)
 37                {
 38                    string courseNumber = xmlCourse.GetAttribute("Number");
 39                    string title = GetText(xmlCourse, "Title")[0];
 40                    DateTime date = DateTime.Parse(GetText(xmlCourse, "StartDate")[0]);
 41                    string[] attendees = GetText(xmlCourse, "Attendee");
 42                    for (int i = 0; i < attendees.Length; i++)
 43                    {
 44                        WritToFile(courseNumber, title, date, attendees[i]);
 45                    }
 46                }
 47            }
 48            CloseFile();
 49        }
 50
 51        #endregion
 52
 53        private StreamWriter writer = null;
 54
 55        /**//// <summary>
 56        /// Create and opens aunique file
 57        /// </summary>
 58        private void CreateFile()
 59        {
 60            string uniqueName = Guid.NewGuid().ToString();
 61            writer = new StreamWriter(path + uniqueName + ".txt");
 62        }
 63
 64        private void CloseFile()
 65        {
 66            writer.Close();
 67        }
 68
 69        protected override void Activate()
 70        {
 71            CreateFile();
 72        }
 73
 74        protected override void Deactivate()
 75        {
 76            CloseFile();
 77        }
 78
 79        /**//// <summary>
 80        /// Write course information to the comma-separated file
 81        /// </summary>
 82        /// <param name="courseNumber"></param>
 83        /// <param name="title"></param>
 84        /// <param name="startDate"></param>
 85        /// <param name="attendee"></param>
 86        private void WritToFile(string courseNumber, string title, DateTime startDate, string attendee)
 87        {
 88            writer.WriteLine("{0};{1};{2};{3}", courseNumber, title, startDate.ToString("d", CultureInfo.InstalledUICulture), attendee);
 89        }
 90
 91        /**//// <summary>
 92        /// parses the xml data of a single course for the xml element
 93        /// tagName to return the inner text elements
 94        /// </summary>
 95        /// <param name="xmlCourse"></param>
 96        /// <param name="tagName"></param>
 97        /// <returns></returns>
 98        private string[] GetText(XmlElement xmlCourse, string tagName)
 99        {
100            string[] text = null;
101            XmlNodeList nodeList = xmlCourse.GetElementsByTagName(tagName);
102            if (nodeList.Count < 1)
103                throw new Exception("No elements of type <" + tagName + "> available");
104            //CourseException("No elements of type <" + tagName + "> available");
105            text = new string[nodeList.Count];
106            for (int i = 0; i < nodeList.Count; i++)
107            {
108                XmlElement element = nodeList[i] as XmlElement;
109                if (element != null)
110                {
111                    text[i] = element.InnerText;
112                }
113            }
114            return text;
115        }
116    }
117}
118

时间: 2024-10-28 20:33:18

第2章 对象激活上下文-对象激活的相关文章

《精通QTP——自动化测试技术领航》—第1章1.6节对象库(下)之进阶编程篇

1.6 对象库(下)之进阶编程篇 精通QTP--自动化测试技术领航 阶段要点 掌握手写代码的3种方式. 明确测试对象(TO)与运行时对象(RO)的区别. 4种操作对象封装属性的方法. 你也可以是一名魔术师.黑客. 几种常见的QTP无法识别或识别错误的原因. 1.6.1 引言 在对象库上篇这个章节中,相信读者已经对对象库的使用以及其他各个方面有了一个全面的了解.那么从现在开始,作者将引领读者开始基于对象库编程的学习,从而掌握对象库编程的知识与技巧.读者如果觉得在对象库上篇中还有不能够完全掌握的地方

ServletContext(Servlet上下文对象)作用 生命周期

ServletContext(Servlet上下文对象) 容器提供的对象 作用: 1.相对路径转换为绝对路径 String path = "/mp3/1.jpg"; ServletContext ctx = getServletContext(); String realPath = ctx.getRealPath(path); File file = new File(realPath); 2.可以获取容器的附加信息. 容器名称 容器版本 Servlet规范的版本号 3.全局容器 S

《Unreal Engine 4蓝图可视化编程》一第1章 使用蓝图进行对象交互

第1章 使用蓝图进行对象交互 Unreal Engine 4蓝图可视化编程 当开始开发一个游戏时,你想到的第一步应该是建立一个原型.幸运的是,虚幻引擎4和蓝图让基本的游戏功能实现起来比以往任何时候都更容易.这样用户便可以很快地开始测试自己的想法.为了让大家熟悉虚幻编辑器(Unreal Editor)和蓝图(Blueprint),我们将使用一些自带的资源和蓝图建立游戏玩法机制. 本章我们将学习以下内容. 创建新的项目和关卡. 在关卡中置入对象. 通过蓝图改变对象的材质. 使用蓝图编辑器链接所有的蓝

android上下文-如何理解安卓中的上下文对象

问题描述 如何理解安卓中的上下文对象 如何理解安卓中的上下文对象 上下文类是一个怎么样的类 上下文类 有什么属性和方法呢 解决方案 看看http://www.gimoo.net/t/1601/569488535866b.html

0xC015000F 正在被停用的激活上下文不是最近激活的”错误解决方法

程序在windowsXP和Windows7 32系统下运行的好好的,今天装了一个windows7 64位系统(说明,程序本身还是32位开发的),运行时出现"0xC015000F 正在被停用的激活上下文不是最近激活的"这个错误,找了好长时间才解决,下面总结如下:    网上提到较多的方法是在调用CWinApp::InitInstance();接口后面使用afxAmbientActCtx = FALSE;我采用这个方法后确实不会出现这个问题,不过我的程序中有一些代码由于把这个变量设成fal

Application对象与Session对象

上一讲中,我们学习了Request对象的Form数据集合.QueryString数据集合和ServerVariables数据集合.在继续下面的学习之前,建议你先轻松一下,因为接下来要介绍的Application对象相对比较抽象,刚开始理解起来恐怕会不辨东西.切记:当你找不到北时,便不要过多考虑Application对象到底是什么东西?还是一句老话,先学会使用它. 一.了解Application对象.为了提神,我们先看一个计数器的例程(你应该运行它以便于理解):先编辑一个wuf16.htm文件:<

《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

第一章 介绍 线程的优势: 充分利用多处理器 简化模型 简化异步事件的处理 提供用户界面的响应(时间) 线程的风险: 安全的风险(不好的事情会发生),提高错误出现的几率 活性的风险(好的事情不会发生),如某些代码不会执行,出现死锁.活锁以及饥饿 性能的风险,不好的多线程编程可能会危害性能 第二章 线程安全 编写线程安全的代码,实质是管理对状态的访问,尤其是那些共享.可变的状态.对象的状态包括任何能影响它外部可见行为的数据. 当有过个线程能访问状态变量时,而且他们当中能对变量进行修改,则需要对他们

java中的context对象、request对象、response对象都可以存放什么数据?

问题描述 java中的context对象.request对象.response对象都可以存放什么数据? java中的context对象.request对象.response对象在向应用服务器发送请求的过程中都会用到,分别可以存放哪些数据呢?求大神解答,不胜感激! 解决方案 [NET]随时随地访问DB连接,Page对象,Session对象, Request对象, Response对象等Response对象Response对象 解决方案二: 一般来讲存放的是javabean,当然javabean可以

ASP的Application对象和Session对象

本章已经讨论了两个ASP对象:Application对象和Session对象,因此能够访问Application对象和Session对象提供的集合.方法.属性和事件.本节将从程序设计的角度对这两个对象进行研究.· 当载入ASP DLL并响应对一个ASP网页的第一个请求时,创建Application对象.该对象提供一个存储场所,用来存储对于所有访问者打开的所有网页都可用的变量和对象.· 当访问者首次从站点请求一个ASP页面时,为他创建一个Session对象,并保持有效直到缺省的超时周期(或由脚本确