通常IOC实现的步骤为-->建立容器-->加入组件-->获取组件-->使用组件.

  1.建立容器

  建立容器也就是IWindsorContainer.接着我门要向容器中注册服务,并告诉容器所注册的服务由那一个类来实现他.通常建立容器我们可以用以下定义来实现:

双击代码全选
1
1IWindsorContainer container = new WindsorContainer();

  2.加入组件

  向建立好的容器里加入组件,直接调用容器的AddComponent()来完成.比如现在有一个写日志的接口ILog,实现这个服务的组件是TextLog,那我门可以通过如下方法把该组件加入到容器:

双击代码全选
1
1container.AddComponent("txtLog", typeof(ILog), typeof(TextLog));

  3.获取组件

  获取组件可以直接通过加入组件的时候使用的key来获取,返回的是一个IWindsorContainer,这里需要一个强制转换.

双击代码全选
1
1ILog log = (ILog)container["txtLog"];

  4.使用组件

  1//把当前时间写入到日志文件去

  2log.Write(DateTime.Now.ToShortDateString());   上面就是一个IOC容器的工作过程,从创建容器--加入组件--获取组件--使用组件.下面我看来看看一个小实例,也就是我在学习IOC的时候结合网上的资源自己小试牛刀瞎写的.

  -------------------------------------------------------------------------------------------------------------

  ILog接口(服务)的定义:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace IOCDayOne
6{
7  /**//// <summary>
8  /// 日志服务
9  /// </summary>
10  public interface ILog
11  {
12    /**//// <summary>
13    /// 写日志方法
14    /// </summary>
15    /// <param name="msgStr">日志内容</param>
16    void Write(string msgStr);
17  }
18}
19

  TextLog组件的定义:

双击代码全选
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
1namespace IOCDayOne
2{
3  /**//// <summary>
4  /// ILog服务的组件
5  /// </summary>
6  public class TextFileLog:ILog
7  {
8    private string _target;  //私有成员
9    private ILogFormat _format; //ILogFormat一内聚的方式存在
10
11    /**//// <summary>
12    /// 构造方法
13    /// </summary>
14    /// <param name="target">标识</param>
15    /// <param name="format">提供格式化服务的接口</param>
16    public TextFileLog(string target, ILogFormat format)
17    {
18      this._target = target;
19      this._format = format;
20    }
21
22    /**//// <summary>
23    /// 写日志的实现方法
24    /// </summary>
25    /// <param name="msgStr">日志内容</param>
26    public void Write(string msgStr)
27    {
28      string str = _format.Format(msgStr); //格式化日志
29      str += _target;  //日志内容为格式化后的字符+类构造时传入的标识参数
30
31      //下面将日志记录到文本文件
32      FileStream fs = new FileStream(this._target, FileMode.Append);
33      StreamWriter sw = new StreamWriter(fs, Encoding.Default);
34      sw.WriteLine("Log:-->" + str);
35      sw.Close();
36    }
37  }
38}

XML配置文件的定义(指定将日志记录到C:Log.txt),TextLog组件需要存储路径的参数,我们在建立IOC容器的时候指定容器到这个配置文件中来找"target":

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
1<?xml version="1.0" encoding="utf-8" ?>
2<configuration>
3 <components>
4  <component id="txtLog">
5   <parameters>
6    <target>C:Log.txt</target>
7   </parameters>
8  </component>
9 </components>
10</configuration>
11

  出此之外还有一个格式化日志的服务IlogFormat,可将日志格式化为一定的格式输出,定义如下:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1namespace IOCDayOne
2{
3  /**//// <summary>
4  /// 格式化日志服务接口
5  /// </summary>
6  public interface ILogFormat
7  {
8    /**//// <summary>
9    /// 格式化日志方法
10    /// </summary>
11    /// <param name="msgStr">日志内容</param>
12    /// <returns></returns>
13    string Format(string msgStr);
14  }
15}

实现ILogFormat服务的组件定义为:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1namespace IOCDayOne
2{
3  public class TextFormat:ILogFormat
4  {
5    /**//// <summary>
6    /// 格式化日志内容
7    /// </summary>
8    /// <param name="msgStr">日志内容</param>
9    /// <returns></returns>
10    public string Format(string msgStr)
11    {
12      return "On:" + msgStr;
13    }
14  }
15}

  到这里,来写个测试方法测试看看.

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1namespace IOCDayOne
2{
3  class Program
4  {
5    static void Main(string[] args)
6    {
7      //建立容器
8      IWindsorContainer container = new WindsorContainer(new XmlInterpreter("<a href=""http://www.cnblogs.com/Config/ConfigBase.xml/"">http://www.cnblogs.com/Config/ConfigBase.xml</a>"));
9      //加入组件
10      container.AddComponent("txtLog", typeof(ILog), typeof(TextFileLog));
11      container.AddComponent("format", typeof(ILogFormat), typeof(TextFormat));
12      //获取组件
13      ILog log = (ILog)container["txtLog"];
14      //使用组件
15      log.Write(DateTime.Now.ToShortDateString());
16    }
17  }
18}

  测试输出的结果为:

双击代码全选
1
Log:-->On:2008-4-3C:Log.txt

  上面的main()中可以看书,在使用组件的时候只传递了一个参数(日志内容),而实现ILog服务的组件的构造方法是需要两个参数,

双击代码全选
1
2
3
4
5
6
7
8
9
10
1/**//// <summary>
2/// 构造方法
3/// </summary>
4/// <param name="target">标识</param>
5/// <param name="format">提供格式化服务的接口</param>
6public TextFileLog(string target, ILogFormat format)
7{
8  this._target = target;
9  this._format = format;
10}  

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

  到这里,一个IOC的完整实例就完成了.其实还有另外一种方式实现.详细见下面.

  -------------------------------------------------------------------------------------------------------------

  上面是通过把配置写到XML的,而组件与服务是直接通过容器的加入组件来完成匹配.这样显然是不够灵活的,一单需求发生了变化,实现ILog服务的组件不在是TextFileLog的时候又该怎么处理呢?我们又去修改加入组件时的程序代码来实现,这样是可以达到需求的,但是这样做很明显不够灵活.那怎么做才能让服务去调用具体的实现组件修改方便呢?另一种方式是通过配置文件(App.config/Web.config)来实现.

  下面是针对上面这个实例定义的App.config配置:

双击代码全选
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
1<?xml version="1.0" encoding="utf-8" ?>
2<configuration>
3 <configSections>
4  <section name="castle"
           type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,Castle.Windsor"/>
5 </configSections>
6 <castle>
7  <components>
8   <component id="txtLog"
              service="IOCDayOne.ILog,IOCDayOne"
              type="IOCDayOne.TextFileLog,IOCDayOne">
9    <parameters>
10     <target>C:Log.txt</target>
11    </parameters>
12   </component>
13   <component id="format"
               service="IOCDayOne.ILogFormat,IOCDayOne"
               type="IOCDayOne.TextFormat,IOCDayOne">
14    <paramters>
15     <target>DayOne</target>
16    </paramters>
17   </component>
18  </components>
19 </castle>
20</configuration>

  这时,测试方法就需要改动下了,通过配置文件来完成IOC,详细如下:

本文示例代码或素材下载

Castle学习笔记----初探IOC容器的更多相关文章

  1. Go学习笔记06-内建容器

    Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0  va ...

  2. Spring学习笔记--Spring IOC

    沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...

  3. Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...

  4. Spring学习笔记1——IOC: 尽量使用注解以及java代码

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...

  5. Spring.net(二)----初探IOC容器

    我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和 ...

  6. spring源码学习之路---IOC容器初始化要义之bean定义载入(五)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...

  7. 6. Laravel5学习笔记:IOC/DI的理解

    介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自己主 ...

  8. Spring学习记录1——IoC容器

    IoC容器 1.1  IoC概述 Ioc(Inverse of Control,控制反转)是Spring容器的内核.对于软件来说,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由 ...

  9. Spring学习一: Ioc容器

    Spring 容器:      Spring 容器是Spring框架的核心.Spring容器将创建Bean对象实例,把它们联系在一起,配置它们,并管理它们整个生命周期从创建到销毁.Spring 容器通 ...

随机推荐

  1. Heritrix源码分析(十四) 如何让Heritrix不间断的抓取(转)

    欢迎加入Heritrix群(QQ):109148319,10447185 , Lucene/Solr群(QQ) :  118972724 本博客已迁移到本人独立博客: http://www.yun5u ...

  2. 获取当前匹配元素 包括自身的html

    $(".test").prop("outerHTML"); 来自为知笔记(Wiz)

  3. JVM——类加载机制

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过 ...

  4. InnoDB 引擎独立表空间 innodb_file_per_table

    使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你 ...

  5. C# "error CS1729: 'XXClass' does not contain a constructor that takes 0 arguments"的解决方案

    出现这种错误的原因时,没有在子类的构造函数中指出仅有带参构造函数的父类的构造参数. 具体来讲就是: 当子类要重用父类的构造函数时, C# 语法通常会在子类构造函数后面调用 : base( para_t ...

  6. Solaris系统管理(一)

    最近需要将一个项目从Linux平台迁移到Solaris,对Solaris进行了一点研究,总结如下. 一句话介绍: Solaris 是Sun Microsystems研发的计算机操作系统.它被认为是UN ...

  7. Scrum流程

    敏捷Scrum流程图: Sprint Planing Meeting: 1.Next Spring Goal; 2.Sprint Backlog; 3.Updated Product Backlog; ...

  8. Java Web高性能开发(二)

    今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...

  9. debian7下部署nginx服务器

    笔者是在vmware中的Debian7下部署nginx服务器,采用离线部署方式.过程如下: 1.准备好需要的离线安装包 nginx-1.6.2.tar.gz,pcre-8.34.tar.gz,open ...

  10. 上传控件swfupload的使用笔记

    1.下载下来的官方domo里不同的例子里会引入各自的JS,注意区分.可以直接拿官方例子来改成自己想要的例子. 2.注意PHP配置文件里也有最大上传文件限制,如果文件太大会上传不成功. 3.如果有问题可 ...