天天看點

IoC and Castle.IoC

1. 什麼是 IoC ?

關于IoC的詳細解釋請看 Inversion of Control Containers and the Dependency Injection pattern (英文/中文),本文隻會作一些簡單介紹

IoC(Inversion of Control),我們叫它"控制反轉",也可以叫它"依賴注入"(Dependency Injection)。

引用自 JGTM'2004 [MVP] 的話來解釋IoC

>>> 原來我是這樣解釋應用IoC的意圖和方式的(但還是不夠清晰):如果我想打破A->B的依賴,那麼我可以通過引入A、B之間的互動協定I來辦到,也 就是将A->B變為(A->I)+(I<-B)(此舉同時滿足了DIP和OCP原則),那麼IoC就是幫助我們用各種各樣的方法(如構 造器注入、屬性注入或接口注入等等)在運作期把I的一個具體實作B傳達給A使用的一系列機制。

使用IoC的主要目地就是實作程式子產品的低偶合,在DotNet下比較著名的IoC架構是Castle和Spring.net。

2. IoC的三種形式

依賴注入的形式主要有三種,我分别将它們叫做構造子注入(Constructor Injection)、設值方法注入(Setter Injection)和接口注入(Interface Injection)。

3. Castle中的IoC介紹

Castle.IoC 支援構造子注入和設值方法注入,但更側重構造子注入。

4. 使用Castle.IoC

使用 Castle.IoC 主要是配置 components

4.1 使用代碼配置

IoC and Castle.IoC

public   static  WindsorContainer container  =   new  WindsorContainer(  @" ../../config.xml "  );

IoC and Castle.IoC

container.AddComponent(  " FormatService " ,  typeof (FormatService) );

IoC and Castle.IoC

container.AddComponent(  " format " ,  typeof (IMessageFormat),  typeof (HtmlMessage) );

4.2 使用XML檔案配置

IoC and Castle.IoC

<? xml version="1.0" encoding="utf-8"  ?>  

IoC and Castle.IoC

< castle >

IoC and Castle.IoC

     < components >

IoC and Castle.IoC

         < component  id ="FormatService"

IoC and Castle.IoC

                   type ="IoCSample.FormatService,IoCSample"   />

IoC and Castle.IoC
IoC and Castle.IoC

         < component  id ="format"  

IoC and Castle.IoC

                   service ="IoCSample.Components.IMessageFormat,IoCSample"  

IoC and Castle.IoC

                   type ="IoCSample.Components.HtmlMessage,IoCSample"   />

IoC and Castle.IoC

     </ components >

IoC and Castle.IoC

</ castle >

如何配置IList,IDictionary,Array等複雜類型

IDictionary

代碼:

IoC and Castle.IoC

public   class  C

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC
IoC and Castle.IoC

    public C()

IoC and Castle.IoC

{}

IoC and Castle.IoC

    public C(IDictionary d)

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC

        this.dictionary=d;

IoC and Castle.IoC

    }

IoC and Castle.IoC

    private IDictionary dictionary;

IoC and Castle.IoC

    public IDictionary Dictionary

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC
IoC and Castle.IoC

        get

IoC and Castle.IoC

{return this.dictionary;}

IoC and Castle.IoC

    }

IoC and Castle.IoC

} 配置:

IoC and Castle.IoC

< component  id ="c"  type ="CastleDemo.C,CastleDemo" >

IoC and Castle.IoC

   < parameters >

IoC and Castle.IoC

     < d >

IoC and Castle.IoC

       < item   keyType ="System.String"  valueType ="System.String" >

IoC and Castle.IoC

         < item  key ="a" > a </ item >

IoC and Castle.IoC

         < item  key ="b" > b </ item >

IoC and Castle.IoC

       </ item >

IoC and Castle.IoC

     </ d >

IoC and Castle.IoC

   </ parameters >

IoC and Castle.IoC

</ component >

IList

代碼:

IoC and Castle.IoC

public   class  D

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC

    private IList list;

IoC and Castle.IoC
IoC and Castle.IoC

    public D()

IoC and Castle.IoC

{}

IoC and Castle.IoC

    public IList List

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC
IoC and Castle.IoC

        get

IoC and Castle.IoC

{return this.list;}

IoC and Castle.IoC

    }

IoC and Castle.IoC

    public D(IList list)

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC

        this.list=list;

IoC and Castle.IoC

    }

IoC and Castle.IoC

} 配置:

IoC and Castle.IoC

< component  id ="d"  type ="CastleDemo.D,CastleDemo" >

IoC and Castle.IoC

   < parameters >

IoC and Castle.IoC

     < list >

IoC and Castle.IoC

       < item  type ="System.String" >

IoC and Castle.IoC

         < item > a </ item >

IoC and Castle.IoC

         < item > b </ item >

IoC and Castle.IoC

         < item > c </ item >

IoC and Castle.IoC

       </ item >

IoC and Castle.IoC

     </ list >

IoC and Castle.IoC

   </ parameters >

IoC and Castle.IoC

</ component >

Array

代碼:

IoC and Castle.IoC

public   class  E

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC

    private int[] ages;

IoC and Castle.IoC

    public int[] Ages

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC
IoC and Castle.IoC

        get

IoC and Castle.IoC

{return this.ages;}

IoC and Castle.IoC

    }

IoC and Castle.IoC

    public E()

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC
IoC and Castle.IoC

    }

IoC and Castle.IoC

    public E(int[] ages)

IoC and Castle.IoC
IoC and Castle.IoC
IoC and Castle.IoC

{

IoC and Castle.IoC

        this.ages=ages;

IoC and Castle.IoC

    }

IoC and Castle.IoC

} 配置:

IoC and Castle.IoC

< component  id ="e"  type ="CastleDemo.E,CastleDemo" >

IoC and Castle.IoC

   < parameters >

IoC and Castle.IoC

     < ages >

IoC and Castle.IoC

       < item  type ="System.Int32" >

IoC and Castle.IoC

         < item > 1 </ item >

IoC and Castle.IoC

         < item > 2 </ item >

IoC and Castle.IoC

         < item > 3 </ item >

IoC and Castle.IoC

       </ item >

IoC and Castle.IoC

     </ ages >

IoC and Castle.IoC

   </ parameters >

IoC and Castle.IoC

</ component >  

繼續閱讀