程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Castle IOC容器實踐之TypedFactory Facility(一)

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

編輯:關於.NET

主要內容

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.創建產品接口

/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IProduct
{
  void Display();
}

2.定義多個具體的產品,實現於接口Iproduct

/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductA : IProduct
{
  public void Display()
  {
    Console.WriteLine("ConcreteProductA");
  }
}
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductB : IProduct
{
  public void Display()
  {
    Console.WriteLine("ConcreteProductB");
  }
}
/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class ConcreteProductC : IProduct
{
  public void Display()
  {
    Console.WriteLine("ConcreteProductC");
  }
}

3.定義工廠接口

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

/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IFactory
{
  // 創建方法
  IProduct Create(string id);
}

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

/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public interface IFactory
{
  // 創建方法
  IProduct Create(string id);
  // 銷毀方法
  void Release(IProduct handler);
}

4.創建配置文件

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

<!--/*
  Author:Terrylee
  Date:2006年5月12日
  From:http://terrylee.cnblogs.com
*/-->
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <facilities>
    <facility id="typedfactory">
      <factories>
        <factory id="factory" interface="TypedFactoryFacilityDemo.IFactory, TypedFactoryFacilityDemo"
          creation="Create" destruction="Release" />
      </factories>
    </facility>
  </facilities>
</configuration>

5.使用TypedFactory Facility

有了前面幾步的准備,現在就可以使用了,只需要注冊Facility就可以了,容器會自動根據配置信息來注冊工廠類的實現

/**//// <summary>
/// Author:Terrylee
/// Date:2006年5月12日
/// From:http://terrylee.cnblogs.com
/// </summary>
public class App
{
  public static void Main()
  {
    // 初始化容器
    IWindsorContainer container = new WindsorContainer(new XmlInterpreter("../../MyConfig.xml") );
    // 加入TypedFactory Facility
    container.AddFacility( "typedfactory", new TypedFactoryFacility() );
    // 加入具體產品
    container.AddComponent( "proda", typeof(IProduct), typeof(ConcreteProductA) );
    container.AddComponent( "prodb", typeof(IProduct), typeof(ConcreteProductB) );
    container.AddComponent( "prodc", typeof(IProduct), typeof(ConcreteProductC) );
    // 獲取工廠實例
    IFactory factory = (IFactory)container["factory"];
    // 使用具體產品
    IProduct pa = factory.Create("proda");
    pa.Display();
    IProduct pb = factory.Create("prodb");
    pb.Display();
    IProduct pc = factory.Create("prodc");
    pc.Display();
    Console.ReadLine();
  }
}

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved