Castle IOC容器快速入门
摘要: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
/// </summary>
public interface ILog
{
void Write(string MsgStr);
}
/// 编写:Terrylee
/// 出处:http://terrylee.cnblogs.com
/// </summary>
public interface ILogFormatter
{
string Format(string MsgStr);
}
3.编写组件
仅仅有接口还不行,还需要实现了上面两个接口的具体实现类,这些类我们把它叫做组件。
/// 编写:Terrylee
/// 出处:http://terrylee.cnblogs.com
/// </summary>
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
/// </summary>
public class TextFormatter : ILogFormatter
{
public TextFormatter()
{
}
public string Format(string MsgStr)
{
return "[" + MsgStr + "]";
}
}
4.编写配置文件
编写配置文件,由于TextFileLog构造函数中除了需要一个ILogFormatter的实例之外,还需要指定信息的输出的文本文件名,所以编写一个配置文件来指定,这个也可以放在应用程序配置文件中(Web.config或者App.config)。
<configuration>
<components>
<component id="txtLog">
<parameters>
<target>log.txt</target>
</parameters>
</component>
</components>
</configuration>
5.使用Castle IOC容器
前面的几步仅仅是为我们Castle IOC做准备,下面就是正式使用了。使用Castle IOC容器非常简单,基本上分为建立容器,加入组件,获取组件,使用组件几个步骤。
/// 编写:Terrylee
/// 出处:http://terrylee.cnblogs.com
/// </summary>
public class App
{
public static void Main()
{
//建立容器
IWindsorContainer container = new WindsorContainer( new XmlInterpreter("http://www.cnblogs.com/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中去查找。
运行程序,可以看到输出的结果:
怎么样?够简单的吧。可以看到整个过程非常的简单,代码也非常优雅,我们并没有使用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
Castle IOC容器快速入门相关推荐
- Castle IOC容器内幕故事(上)
摘要:在快速入门指南篇中,我们对于Castle IOC容器的使用已经有了一个直观的认识.本文将在这基础上进一步对Castle IOC容器的结构及其注册组件的过程做一个深入的分析,让我们开始Castle ...
- Castle IOC容器实践之TypedFactory Facility(一)
摘要:相信大家对于Factory Method设计模式都已经不陌生了,在Factory Method中,对于每一个具体的产品都需要有一个与之对应的工厂类,随着具体的产品越来越多,我们对于工厂类的管理就 ...
- Castle IOC容器与Spring.NET配置之比较
我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...
- Castle实践9-在Castle IOC容器中使用AspectSharp(全面剖析AspectSharp Facility)
在"Castle实践8"介绍了A#的使用方法,那么A#如何和Castle IOC容器结合起来使用呢?在Castle的官方falicicies库中,提供了AspectSharp Fa ...
- Castle IOC容器实践之EnterpriseLibrary Configuration Facility
摘要:EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件.熟悉Enterprise Library的人 ...
- 多个容器一起打包_容器快速入门完全指南
介 绍 容器,以及Docker和Kubernetes之类的容器技术已经日益成为许多开发人员工具包中常见的工具.容器化的核心目标是提供一种更好的方式,以可预测和便于管理的方式在不同的环境中创建.打包以及 ...
- 【容器】Podman容器快速上手
Podman容器快速入门 什么是Podman? Podman与Docker的主要区别是什么? podman 的使用与 docker 有什么区别? podman的常用命令 容器相关命令 镜像操作相关命令 ...
- Castle ActiveRecord学习实践(1):快速入门指南
摘要:最近几天有时间看了一下Castle,原来它的功能是如此的强大,从数据访问框架到IOC容器,再到WEB框架,基本包括了整个开发过程中的所有东西,看来得好好学习研究一下了,并且打算把自己学习过程的一 ...
- Spring之IOC快速入门(一)
2019独角兽企业重金招聘Python工程师标准>>> 文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.21 lutianfei none 本文内 ...
最新文章
- seaborn可视化多水平分类变量分组箱图boxplot并自定义多个箱体的顺序(Manually Order Boxes in Boxplot with Seaborn)
- C++模板之特化与偏特化详解
- 文件可视化编辑_高维数据可视化必备图形平行坐标图
- Codeforces 173E Camping Groups 线段树
- python中变量的类型是动态的随时可以变化_python动态类型简介
- 判断对象是否为数组/函数
- 项目思考001---近期这个电台购物项目的一点点思考
- python的httplib、urllib和urllib2的区别及应用
- Leetcode 742.二叉树最近的叶子结点
- java socket 连接原理_Java socket通信基本原理介绍
- LAMP之PHP服务的安装(libphp7.so方式)
- 手机连接蓝牙扫码枪_扫码枪蓝牙连接电脑 蓝牙扫码枪
- 鲍威尔法源程序码matlab,十一、Powell算法(鲍威尔算法)原理以及实现
- 从零开始学_JavaScript_系列(八)——js系列2(事件触发顺序、文本读取、js编写ajax、输入验证、下拉菜单)
- Qt手动设置Kits套件
- 索迪斯携手喜茶致敬白衣天使、慰问抗疫英雄
- 浅谈英语学习兴趣的培养
- 荧光微球激发光谱图/橙色荧光微球/绿色荧光微球/氨基红色荧光微球/氨基橙色荧光微球
- charles软件关闭后浏览器无法上网的问题
- 第三方远程控制工具TeamViewer的安装和使用教程,可下载window版和linux版,windows使用虚拟机可以与linux之间通讯
热门文章
- FPGA之道(73)设计方法学与FPGA程序设计的境界
- 【FPGA】双端口RAM的设计(异步读写)
- 【 FPGA 】Xilinx FPGA器件命名意义?
- Git学习系列之Windows上安装Git之后的一些配置(图文详解)
- SAP ECC6.0-中建信息版
- Qt 静态编译后的exe太大, 可以这样压缩.
- lua table.sort的bug
- 传苹果产品总设计师欲离职 地位堪比乔布斯
- jq实现文字个数限制_jQuery插件InputLimitor实现文本框输入限制字数统计
- 正态分布随机数 C语言,C语言产生满足正态分布的随机数