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。

  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/Castle-1.html
Copyright © 2011-2022 走看看