zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    [转]C# 动态调用 WebService
    [转]走进 LINQ 的世界
    [转]mybatis-generator 代码自动生成工具(maven方式)
    [转]Netty入门(最简单的Netty客户端/服务器程序)
    FastJson 常见问题
    初识 ElasticSearch
    Maven Gradle 区别
    IDEA 自动生成serialVersionUID
    restful 架构详解
    初识shell expect
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/Castle-1.html
Copyright © 2011-2022 走看看