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,这样的接口我们一般叫做服务,即实现了某种服务的接口(后面会讲到)。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**//// <summary>/// 编写:Terrylee/// </summary>public interface ILog{ void Write(string MsgStr);}/**//// <summary>/// 编写:Terrylee/// </summary>public interface ILogFormatter{ string Format(string MsgStr);} |
3.编写组件
仅仅有接口还不行,还需要实现了上面两个接口的具体实现类,这些类我们把它叫做组件。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/**//// <summary>/// 编写:Terrylee/// </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); }}/**//// <summary>/// 编写:Terrylee/// </summary>public class TextFormatter : ILogFormatter{ public TextFormatter() { } public string Format(string MsgStr) { return "[" + MsgStr + "]"; }} |
4.编写配置文件
编写配置文件,由于TextFileLog构造函数中除了需要一个ILogFormatter的实例之外,还需要指定信息的输出的文本文件名,所以编写一个配置文件来指定,这个也可以放在应用程序配置文件中(Web.config或者App.config)。
|
1
2
3
4
5
6
7
8
9
10
|
<?xml version="1.0" encoding="utf-8" ?><configuration> <components> <component id="txtLog"> <parameters> <target>log.txt</target> </parameters> </component> </components></configuration> |
5.使用Castle IOC容器
前面的几步仅仅是为我们Castle IOC做准备,下面就是正式使用了。使用Castle IOC容器非常简单,基本上分为建立容器,加入组件,获取组件,使用组件几个步骤。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/**//// <summary>/// 编写:Terrylee/// </summary>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[FirstCastleIOCDemo]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 IOC容器快速入门的更多相关文章
- 依赖注入DI(IOC)容器快速入门
1.什么是IOC IOC是一种设计模式,全程控制翻转或叫依赖注入.更详细介绍见http://martinfowler.com/articles/injection.html 2.为什么用IOC 我们通 ...
- Castle IOC容器与Spring.NET配置之比较
我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...
- 【云计算】Dockerfile、镜像、容器快速入门
Dockerfile.镜像.容器快速入门 1.1.Dockerfile书写示例 Dockerfile可以用来生成Docker镜像,它明确的定义了Image的生成过程.虽然直接修改容器也可以提交生成镜像 ...
- Castle IOC容器组件生命周期管理
主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...
- Castle IOC容器构建配置详解(二)
主要内容 1.基本类型配置 2.Array类型配置 3.List类型配置 4.Dictionary类型配置 5.自定义类型转换 一.基本类型配置 在Castle IOC的配置文件中,大家可能都已经注意 ...
- Castle IOC容器构建配置详解(一)
主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...
- Castle IOC容器内幕故事(上)
主要内容 1.WindsorContainer分析 2.MicroKernel分析 3.注册组件流程 一.WindsorContainer分析 WindsorContainer是Castle的IOC容 ...
- Castle IOC容器内幕故事(下)
主要内容 1.ComponentModelBuilder 和 Contributors 2.Contributors分析 3.Handles分析 4.ComponentActivator分析 一.Co ...
- Castle IOC容器实践之FactorySupport Facility
PDF版本下载:http://file.ddvip.com/2008_10/1223538519_ddvip_4853.rar示例代码下载:http://file.ddvip.com/2008_10/ ...
随机推荐
- GridView表头排序方法设置
1.效果图 2.前台代码 说明:红色代码为核心代码 <asp:GridView ID="gvData" runat="server" AutoGenera ...
- AngularJS promise()
实例说明一 <!DOCTYPE html> <html ng-app="my-app"> <head> <meta charset=&qu ...
- apache开源项目-- Velocity
Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...
- Java [Leetcode 58]Length of Last Word
题目描述: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return ...
- LeetCode: Reverse Words in a String && Rotate Array
Title: Given an input string, reverse the string word by word. For example,Given s = "the sky i ...
- 【ASP.NET MVC】"[A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 ..."的解决办法
1.错误页面: “/”应用程序中的服务器错误. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]System.Web ...
- ECshop 二次开发模板教程1
本教程适用于了解 ECshop 和 ECshop模板DIY 以及它们的日常使用,在查看前阁下需要至少会使用一种编辑器(exp:Dreamweaver, editplus, emacs, vi, ee ...
- TeamViewer
TeamViewer远程连接非常好用
- 完美完全卸载Oracle 11g数据库
Oracle 11g可在开始菜单中卸载,然后同时需要删除注册表中相关内容. 操作系统:windows10专业版. 卸载步骤: 1.停用oracle服务:进入计算机管理,在服务中,找到oracle开头的 ...
- http://jingyan.baidu.com/article/4dc40848e7b69bc8d946f127.html
http://jingyan.baidu.com/article/4dc40848e7b69bc8d946f127.html