网络游戏研发网-OGDEV.NET-中国最大的游戏开发交流平台之一,提供游戏制作、游戏研发开发资料、网络游戏开发技术,游戏开发者,中国最权威的游戏开发网站 网络游戏研发网-OGDEV.NET-学者园地
     
 
你必须知道的.NET之对接口和抽象类
ASP.Net中利用CSS实现多界面两法
将ASP页面转换成HTM静态页面的方法
ASP.NET技术获取IP与MAC地址的方法
ASP.NET移动开发之SelectionList控件
ASP.NET中为GridView添加删除提示框
理解ASP.NET与客户端缓存之HTTP协议
ASP.NET中Session的状态保持方式浅议
 
次世代游戏引擎光影制作简述(七)
次世代游戏引擎光影制作简述(六)
次世代游戏引擎光影制作简述(五)
次世代游戏引擎光影制作简述(四)
次世代游戏引擎光影制作简述(三)
C++良好代码风格之我见 - 兼谈boost的工程实用价值
游戏中打怪行为的人类学分析(三)
次世代游戏引擎光影制作简述(二)
 
[电子书下载]游戏设计 — 原理与实践
[电子书下载]网络游戏开发
游戏设计全过程
[电子书下载]游戏设计技术
CS游戏人物模型制作教程
[电子书下载]游戏设计理论
CG人物插画基本流程
[转贴]MAX高级人头教程
 
 
您的位置:   .NET
 
文章标题 Castle IOC容器快速入门
来源: [ ogdev ] 浏览: [1174]
 
摘要:IOC模式是近年来非常流行的一种模式,相信大家都不陌生了,如果你还不是很熟悉的话,可以看看Martin Fowler大师的文章http://martinfowler.com/articles/injection.html,网上可以下载到中文版本。在Castle中,Windsor就是它的一个IOC容器,它构建于MicroKernel之上,功能非常强大。本文将通过一个简单的例子来带你快速走进Castle IOC容器。



主要内容

1.为什么要IOC

2.什么是Castle IOC容器

3.快速入门示例

4.几个重要的概念



一,为什么要IOC

IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已经讲解的非常精彩了,这里实在不敢班门弄斧,只好简单地解释几句。我们使用抽象接口来隔离使用者和具体实现之间的依赖关系,但是不管再怎么抽象,最终还是要创建具体实现类的实例,这种创建具体实现类的实例对象就会造成对于具体实现的依赖,为了消除这种创建依赖性,需要把依赖移出到程序的外部(比如配置文件)。使用依赖注入后,这些类完全是基于抽象接口编写而成的,所以可以最大限度地适应需求的变化。依赖注入的形式有三种,分别为构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。



二.什么是Castle IOC容器

Windsor是Castle 的一个IOC容器。它构建于MicroKernel之上,功能非常之强大,能检测类并了解使用这些类时需要什么参数,检测类型和类型之间工作依赖性,并提供服务或者发生错误时提供预警的机制。



三.快速入门示例

现在假如我们有这样一个需求,开发一个日志组件,把日志信息输出到文本文件,同时对输出的信息进行格式化,以示意性的代码来实现。

1.新建一个C#工程,添加对以下Dll的引用

Castle.DynamicProxy.dll

Castle.MicroKernel.dll

Castle.Model.dll

Castle.Windsor.dll

2.编写服务

既然是日志组件,我们先添加两个接口分别为ILog和ILogFormatter,这样的接口我们一般叫做服务,即实现了某种服务的接口(后面会讲到)。


/**////

/// 编写:Terrylee

/// 出处:http://terrylee.cnblogs.com

///


public interface ILog

{

void Write(string MsgStr);

}



/**////

/// 编写:Terrylee

/// 出处:http://terrylee.cnblogs.com

///


public interface ILogFormatter

{

string Format(string MsgStr);

}

3.编写组件

仅仅有接口还不行,还需要实现了上面两个接口的具体实现类,这些类我们把它叫做组件。


/**////

/// 编写:Terrylee

/// 出处:http://terrylee.cnblogs.com

///


public class TextFileLog : ILog

{

private string _target;

private ILogFormatter _format;



public TextFileLog(string target,ILogFormatter format)

{

this._target = target;

this._format = format;

}



public void Write(string MsgStr)

{

string _MsgStr = _format.Format(MsgStr);

_MsgStr += _target;



//Output Message

Console.WriteLine("Output "+_MsgStr);

}

}


/**////

/// 编写:Terrylee

/// 出处:http://terrylee.cnblogs.com

///


public class TextFormatter : ILogFormatter

{

public TextFormatter()

{



}



public string Format(string MsgStr)

{

return "[" + MsgStr + "]";

}

}

4.编写配置文件

编写配置文件,由于TextFileLog构造函数中除了需要一个ILogFormatter的实例之外,还需要指定信息的输出的文本文件名,所以编写一个配置文件来指定,这个也可以放在应用程序配置文件中(Web.config或者App.config)。











log.txt










5.使用Castle IOC容器

前面的几步仅仅是为我们Castle IOC做准备,下面就是正式使用了。使用Castle IOC容器非常简单,基本上分为建立容器,加入组件,获取组件,使用组件几个步骤。



/**////

/// 编写:Terrylee

/// 出处:http://terrylee.cnblogs.com

///


public class App

{

public static void Main()

{

//建立容器

IWindsorContainer container = new WindsorContainer( new XmlInterpreter("../../BasicUsage.xml") );



//加入组件

container.AddComponent( "txtLog",

typeof(ILog), typeof(TextFileLog) );



container.AddComponent( "format",

typeof(ILogFormatter), typeof(TextFormatter) );



//获取组件

ILog log = (ILog) container["txtLog"];



//使用组件

log.Write("First Castle IOC Demo");



Console.ReadLine();

}

}

简单的描述一下:

第一步:注册了一个Windsor容器;

第二步:向容器中注册ILog服务,并告诉容器TextFileLog实现了这个服务,这里还设置了一个key的参数,后面可以通过这个参数来获取这个服务,注册ILog时容器会发现这个服务依赖于其他的服务,它会自动去寻找,如果找不到这样的服务,则会抛出一个异常;

第三步:向容器中注册ILogFormatter并告知TextFormatter实现了它;

第四步:容器发现类的构造函数还需要另外一个参数target,这里指定了到BasicUsage.xml中去查找。

运行程序,可以看到输出的结果:

Output [First Castle IOC Demo]log.txt
怎么样?够简单的吧。可以看到整个过程非常的简单,代码也非常优雅,我们并没有使用new关键字创建一个具体实现类的实例,至此,一个简单的使用Castle IOC的过程就完成了。下面我们来理解一下其中几个重要的概念。

四.几个重要的概念

1.服务

服务是一个个的接口,接口约定了服务,从而使随意替换服务的实现对使用接口服务的代码没有任何的影响。像我们上面例子中的ILog,ILogFormatter都是一个个服务,我们在这个例子中支实现了一个文本文件的日志记录,如果你要是实现数据库记录的日志记录,都必须要遵守ILog这个接口。

2.组件

简单来说组件是一个可重用的程序单元,它实现了某个接口,并仅仅只实现了这一个良好的接口。也就是说,组件是实现了某个服务接口的类。像上例中的TextFileLog,TextFormatter都是组件

3.自动装配

在上面的例子中,大家可能都已经注意到了,TextFileLog依赖于TextFormatter,我们却没有在配置文件中指定它们之间的依赖关系,这就是Castle IOC聪明的一个地方,它能够自动管理组件之间的依赖关系,而无需编写特定的xml config来配置,即自动装配的意思。



Castle IOC容器快速入门指南就到这儿,欢迎大家多多指教,后续文章我会详细的去写Castle IOC及其Facility。文中完整的程序:下载


参考资料

Castle的官方网站http://www.castleproject.org
 
本栏目登载此文出于传递信息之目的,如有任何的问题请及时和我们联系!
 
无任何评论!
请您注意:   发表评论:
尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
中国网游研发中心新闻留言板管理人员有权保留或删除其管辖留言中的任意内容
您在中国网游研发中心留言板发表的作品,中国网游研发中心有权在网站内转载或引用
参与本留言即表明您已经阅读并接受上述条款
 
昵     称:
联系EMAIL:  
 
 
关于我们 - 免责声明 - 联络热线 - 申请链接 - 站点地图 - 网站帮助
Copyright © 2004-2007 盛趣信息技术(上海)有限公司 All rights reserved.
OGDEV.NET -- 网络游戏研发网 最佳分辨率 1024×768