今日更新
技术新闻
精彩专题
IBM软件技术专区
微软开发专区
技术文档中心
编程语言
网络通信
网络安全
LINUX/UNIX
软件工程与管理
数据库开发
WEB开发
企业应用与开发
移动开发
资源中心
原创专栏
开放系统世界
人才与培训
技术天地论坛
厂商列表
社区推荐

· 女性身体内部人体受孕..
· 十部顶级的变态与情色..
· 感情放纵让我毁了两个..
· 当我撞见姐姐和男友在..
· 卖淫少女惨遭泄愤民工..
· 偷拍街上的走光mm绝对..
· 百度打击google的广告
· 港娱乐圈与黑社会揭秘
赛迪网>>技术应用>>重点推荐
关键字: .Net;体系结构
来  源: 赛迪网
灵活的.NET体系结构之统一的工厂服务 (1)
作者:Satya Komatineni著 宁凯编译 发文时间:2003.01.22
本文是一篇介绍如何搭建.NET灵活体系结构的文章。前一篇文章介绍了一种可满足应用程序绝大部分配置需求的方法。在那篇文章中,假定某一配置文件的具体内容如下所示:

<GeneralConfiguration>
<section1>
<key1>value1</key1>
</section1>
<section2>
<key name="x">value_for_x</key>
<key name="y" a1="10" a2 ="15">
<a3>16</a3>
<a4>17</a4>
</key>
</section2>
</GeneralConfiguration>


可以通过使用下列描述性调用序列从上述配置文件中访问相关取值:

// get a class responsible for implementing IConfig
     IConfig cfg;
// reading a simple key
     cfg.getValue("/section1/key1") -> value1
// reading a key with reserved name attribute
     cfg.getValue("/section2/key/x") -> value_for_x
// reading a key with reserved name attribute and its 
// attribute/child nodes
     cfg.getValue("/section2/key/y/a1") -> 10
     cfg.getValue("/section2/key/y/a3") -> 16


使用IConfig诸多优点包括:

· 提供了使用简单的API来访问信息层次结构的能力;

· 不必取代 XPath,只需使用一些可行的约定来对其进行补充和完善;

· 允许使用默认值;

· 可区分必选值和可选值;

· 可以在处理关键字取值时不区分大小写;

· 基于特定的假设,可以使用相似的方式来处理属性和子元素。

工厂服务: 开始体系结构领域之旅


构建大型结构的关键就是要从简单的想法入手。这就是说,复杂性并不能构建在复杂性基础之上。接下来,我们将详细描述如何在这种简单的配置服务基础之上对其进行扩展并形成应用级的工厂服务。

究竟什么是工厂服务?

语言总会产生这样一种倾向:对流行的编程习惯或实践加以形式化,然后将其引入到语言的构建中。例如,Java 引入了关键字interface,而在Java之前的C++中这仅仅是一种没有正式化的概念。

C#同样具有关键字interface。同时,C#也通过关键字delegate对事件处理进行了形式化处理。为了能够更好地理解工厂服务的含义,需要首先来准确理解接口。之所以这样做,就是因为接口是体系结构的核心概念。

理解接口

接口就像一个具有一套方法的类。因此,如果您得到了一个对象并且明确它实现的接口,您就能以一种可靠的方式来调用这些方法。看看下面的代码,您就会发现它事实上还是很简单的:

//Let us define an interface
interface LoggingInterface
{
     public void logMessage(String message);
}
//Let's see how we can use this interface
public void myLoggingFunction( Object o)
{
     if (o is LoggingInterface)
     {
          LoggingInterface log = (LoggingInterface)o;
          log.message("test message");
     }
     else
     {
          // sorry not sure of the type of this object
          throw new Exception("Unexpected type");
     }
}


现在问题是当您调用logMessage函数时,谁将记录这一消息呢?上面的接口并没有相应代码来负责记录此消息,这应该怎么处理呢?这种情况下,就需要实现下列内容:

public class FileLogger : LoggingInterface
{
     private FileOutputStream fs = null;
     public FileLogger(string filename)
     {
          fs = new FileOutputstream(filename);
     }
     // implement the following method to complete the 
	 // contract required by LoggingInterface
     public void logMessage(String message)
     {
          fs.println(message);
     }
     public close()
     {
          fs.close();
     }
}


好了,您现在可以加入下列代码:

FileLogger     fileLogger = new FileLogger("myfile");
     myLoggingFunction(fileLogger);


现在,提出这样一个要求:需要将所有的日志记录都写入到操作系统所支持的事件日志中。因此,创建一个新类来实现此需求,如下所示:

public class EventLogger : ILog
{
     ... other code
     public void logMessage(string message)
     {
          ..  do the needful
     }
}




FileLogger  fileLogger = new FileLogger("myfile");
     myLoggingFunction(fileLogger);


更改为

EventLogger eventLogger = new EventLogger(..);
     myLoggingFunction(eventLogger);


接下来您就是希望能够得到一个实用函数,该函数可为您提供一个正确的日志接口:

LoggingInterface log = MyUtility.getLogger();
     myLoggingFunction(log);


现在可以开始编写 MyUtility.getLogger() 函数,如下所示:

public LoggingInterface getLogger()
     {
          return new FileLogger("myfile");
          // return new EventLogger();
     }


如果用挑剔的目光来看待目前的进展,您可能就会产生这样的感觉:很长一段时间以来一直忽略的配置服务可能将成为接下来需要认真考虑的内容。您设想有这样一个配置文件,如下所示:

<request name="logger'>
          <classname>EventLogger
     </request>


很多语言中,只要知道了类名和它的继承或派生关系,就能很容易地对此类进行实例化。具备了这些信息,您就可以将 getLogger() 实用函数修改为:

public LoggingInterface getLogger()
     {
          IConfig cfg = ...
          string loggerClassname = cfg.getValue
("/request/logger/classname","EventLogger");
          Object o = instantiateAnObjectForItsClassname(
		      loggerClassName);
// code is not provided for this function
          LoggingInterface log = (LoggingInterface)o;
          return log;
     }


到现在为止,您的目标几乎完全实现了。您能够动态使用配置文件将一个日志类进行实例化。这时,您的需求也随之增长,您又希望此项功能可以为各种各样的类实例化动态对象,而不仅仅局限于当前的日志类。所以,您又再次对实用函数进行了修改:

public static Object getObject(string interfacename)
     {
          IConfig cfg = ...
          string interfaceClassname = cfg.getValue("/request/" +
interfacename + "/classname");
          Object o = instantiateAnObjectForItsClassname(
		      loggerClassName);
// code is not provided for this function
          return o;
     }


1 2 下一页>>



赛迪网推出“IT博客”,花不到一分钟就完成注册
评论】 【推荐】 【 】 【打印】 【关闭

·Linux专区· ·黑客攻防·
· Linux下添加硬盘、分区、格式化任务详解
· FreeBSD服务器的安装与优化之优化篇
· 初学者入门:FreeBSD服务器的安装与优化
· 金企鹅杯两岸四地开源软件大赛圆满结束
· 如何提高Linux系统安全性的十大招数
· 构筑Linux防火墙之为个人用户设置防火墙
· 谁更安全?黑客眼中的防火墙与路由器
· 识破骗局 练就识别QQ活动真伪火眼金睛
· 应用安全大有可为:目的、挑战、总结
· 道高一尺魔高一丈:安全防御的动感魅力
· 警惕网络“内”院起火 积极谋求安内之路
· HHCTRL漏洞被黑客利用 疯狂传播木马
·中国信息化· ·成功案例·
· ERP普及化是饮鸩止渴 精细化才是应用之道
· 赛门铁克第八期《互联网安全威胁报告》解析
· 抢食“数字工商” 国产中间件杀出血路
· 从IBM等操作系统的发展看软件创新的启示
· 服务成就蓝色快车 品牌是怎样炼成的?
· 三大技术应用大会合为一体甲骨文上演三重奏
· 南阳教育城域网 拆掉学校间的“围墙”
· 金算盘助申意美步入信息化快车道
· 不为人知的索尼信息化 谁是幕后英雄?
· InforBus/Q在穗高速路联网收费系统中的应用
· J2EE构建最新金融理念和运作模式的网上银行
· 食品安全令人担心 信息化能否保驾护航
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章   ◆ 站内热点推荐
· 浅析.Net共享程序集编程
· .Net是互联网上的Windows
· .Net Server2003即将面市
· 用VB.Net编写通用报表组件
· EDS声称完成首个.Net银行解决方案
· 网管员论坛
· 开发者之家
· WLAN无限未来
· 我是如何掉进C#的……
· 中国“人件”非正式调查

   
合作网站: IBM dW中国网站 LinuxAID 软件工程专家网 中国系统分析员 UMLChina MATRIX Mobile2008 JavaResearch 华储网 UML软件工程组织 中国JAVA手机网 JAVA中文站 金山在线 海量科技