天天看點

Castle IOC容器實踐之TypedFactory Facility(一)

摘要:相信大家對于Factory Method設計模式都已經不陌生了,在Factory Method中,對于每一個具體的産品都需要有一個與之對應的工廠類,随着具體的産品越來越多,我們對于工廠類的管理就越來越困難,那如何通過IOC容器來實作對工廠的管理呢?本文将給你答案,通過TypedFactory Facility來實作。

主要内容

1.TypedFactory Facility概述

2.TypedFactory Facility快速入門

一.TypedFactory Facility概述

相信大家對于Factory Method設計模式都已經不陌生了,在Factory Method中,對于每一個具體的産品都需要有一個與之對應的工廠類,随着具體的産品越來越多,我們對于工廠類的管理就越來越困難,那如何通過IOC容器來實作對工廠的管理呢?本文将給你答案。在開始使用之前,我們還是先來看一下Castle官方網站中給出的有關TypedFactory Facility的資訊:

Facility Information
Uses proxy Yes
Requires configuration Yes
Uses attributes No
Version Beta 2

二.TypedFactory Facility快速入門

1.建立産品接口

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   interface  IProduct

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    void Display();

Castle IOC容器實踐之TypedFactory Facility(一)

}

2.定義多個具體的産品,實作于接口Iproduct

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   class  ConcreteProductA : IProduct

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    public void Display()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        Console.WriteLine("ConcreteProductA

Castle IOC容器實踐之TypedFactory Facility(一)

");

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

    }

Castle IOC容器實踐之TypedFactory Facility(一)

}

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   class  ConcreteProductB : IProduct

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    public void Display()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

        Console.WriteLine("ConcreteProductB

Castle IOC容器實踐之TypedFactory Facility(一)

");

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

    }

Castle IOC容器實踐之TypedFactory Facility(一)

}

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   class  ConcreteProductC : IProduct

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    public void Display()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

        Console.WriteLine("ConcreteProductC

Castle IOC容器實踐之TypedFactory Facility(一)

");

Castle IOC容器實踐之TypedFactory Facility(一)

    }

Castle IOC容器實踐之TypedFactory Facility(一)

}

3.定義工廠接口

在工廠接口中,隻有一個方法Create()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   interface  IFactory

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    // 建立方法

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

    IProduct Create(string id);

Castle IOC容器實踐之TypedFactory Facility(一)

}

當然了我們也可以為元件加上一個釋放的方法Release()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   interface  IFactory

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    // 建立方法

Castle IOC容器實踐之TypedFactory Facility(一)

    IProduct Create(string id);

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

    // 銷毀方法

Castle IOC容器實踐之TypedFactory Facility(一)

    void Release(IProduct handler);

Castle IOC容器實踐之TypedFactory Facility(一)

}

4.建立配置檔案

在開始的Facility資訊中,可以看到TypedFactory Facility是需要配置資訊

Castle IOC容器實踐之TypedFactory Facility(一)

<!-- -->

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

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

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

< configuration >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

     < facilities >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

         < facility  id ="typedfactory" >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

             < factories >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

                 < factory  id ="factory"  interface ="TypedFactoryFacilityDemo.IFactory, TypedFactoryFacilityDemo"

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

                    creation ="Create"  destruction ="Release"   />

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

             </ factories >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

         </ facility >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

     </ facilities >

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

</ configuration >

5.使用TypedFactory Facility

有了前面幾步的準備,現在就可以使用了,隻需要注冊Facility就可以了,容器會自動根據配置資訊來注冊工廠類的實作

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// <summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Author:Terrylee

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// Date:2006年5月12日

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// From:http://terrylee.cnblogs.com

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

/// </summary>

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

public   class  App

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

    public static void Main()

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

{

Castle IOC容器實踐之TypedFactory Facility(一)

        // 初始化容器

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        IWindsorContainer container = new WindsorContainer(new XmlInterpreter("http://www.cnblogs.com/MyConfig.xml") );

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        // 加入TypedFactory Facility

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        container.AddFacility( "typedfactory", new TypedFactoryFacility() );

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        // 加入具體産品

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        container.AddComponent( "proda", typeof(IProduct), typeof(ConcreteProductA) );

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        container.AddComponent( "prodb", typeof(IProduct), typeof(ConcreteProductB) );

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        container.AddComponent( "prodc", typeof(IProduct), typeof(ConcreteProductC) );

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        // 擷取工廠執行個體

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        IFactory factory = (IFactory)container["factory"];

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        // 使用具體産品

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        IProduct pa = factory.Create("proda");

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        pa.Display();

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        IProduct pb = factory.Create("prodb");

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        pb.Display();

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        IProduct pc = factory.Create("prodc");

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        pc.Display();

Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)
Castle IOC容器實踐之TypedFactory Facility(一)

        Console.ReadLine();

Castle IOC容器實踐之TypedFactory Facility(一)

    }

Castle IOC容器實踐之TypedFactory Facility(一)

}

完整的TypedFactory Facility使 用過程就是這樣的,可以看到,從始至終在程式中隻出現了一個工廠類的接口,并沒有為每一個具體的産品建立一個工廠類,但是最後我們卻可以像使用具體工廠類 那樣使用工廠的執行個體。同時,如果我們需要再新增一個新的産品就非常簡單了。在這裡還需要注意的一點就是在擷取工廠的執行個體時所用到的Key應該是在配置檔案中<factory>節點中配置的工廠ID,而不能是Facility的ID!本篇文章就到這裡,下一篇我會介紹TypedFactory Facility的實作原理,希望感興趣的朋友關注!

下篇:Castle IOC容器實踐之TypedFactory Facility(二)

本文代碼下載下傳:/Files/Terrylee/TypedFactoryFacilityDemo.rar

參考資料

Castle的官方網站http://www.castleproject.org

繼續閱讀