注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 Cisco IOS下载
 帮助

Castle IOC容器实践之FactorySupport Facility


2006-06-29 08:03:00
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://terrylee.blog.51cto.com/342737/67692
摘要:FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:
1.使用访问器来访问组件的实例
2.使用静态方法或者实例方式来访问组件的实例
 
主要内容
1.概述
2.为什么需要FactorySupport Facility
3.如何使用
4.常见的配置示例
5.实现原理浅析
 
一.概述
FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:
1.通过访问器来访问组件的实例
2.通过静态方法或者实例方式来访问组件的实例
二.为什么需要FactorySupport Facility
为了回答这个问题,我们先来看一个简单的使用工厂的例子,如下代码所示:
public interface IComponent 

{
    
void Display();
}


public class MyComponent : IComponent

{
    
public MyComponent()

    
{   

    }


    
public void Display()

    
{
        Console.WriteLine(
"MyComponent");
    }

}


public class MyFactory

{
    
public MyFactory()

    
{

    }


    
public IComponent Create()

    
{
        
return new MyComponent();
    }

}
现在要在程序中使用MyComponent的实例,简单一点会这样去写:
public class App

{
    
static void Main()

    
{
        MyFactory factory 
= new MyFactory();

        IComponent comp 
= factory.Create();

        comp.Display();

    }

}
正如你所看到的,在程序中使用new关键字创建了一个工厂的实例,再由工厂得到组件的实例。现在我们看使用FactorySupport Facility后带来了什么好处。工厂和组件的代码不变,仍然是:
public interface IComponent 

{
    
void Display();
}



public class MyComponent : IComponent

{
    
public MyComponent()

    
{

    }


    
public void Display()

    
{
        Console.WriteLine(
"MyComponent");
    }

}


public class MyFactory

{
    
public MyFactory()

    
{

    }


    
public IComponent Create()

    
{
        
return new MyComponent();
    }

}
配置文件,现在你可以不用理解怎么去配置,后面会讲到。
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    
<facilities>

        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />

    
</facilities>

    
<components>

        
<component id="myfactory" type="FactorySupportDemo.MyFactory,FactorySupportDemo" />

        
<component id="mycomp" type="FactorySupportDemo.MyComponent,FactorySupportDemo"

            factoryId
="myfactory" factoryCreate="Create"></component>

    
</components>

</configuration>
使用组件的实例
public class App

{
    
static void Main()

    
{
        IWindsorContainer container 
= new WindsorContainer("../../Basic.xml");


        IComponent instance 
= (IComponent) container["mycomp"];

        instance.Display();

    }

}
看到了吗?我们并没有使用new关键字创建任何对象,只是把工厂、组件等通过配置文件抛给了IOC容器,再从容器中往外取的时候,就可以直接取到组件的实例,这些实例是由工厂自动创建的,这正是FactorySupport Facility的作用。
三.如何使用
知道了为什么需要FactorySupport Facility之后,下面就来看如何使用Facility。在前面的代码中大家都已经看到了,使用FactorySupport Facility是非常的简单。
1.加入FactorySupport Facility到容器中,可以使用代码加入也可以使用配置文件。
使用代码加入:
IWindsorContainer container = new WindsorContainer("../../Basic.xml");


container.AddFacility(
"factorysupport",new Castle.Facilities.FactorySupport.FactorySupportFacility());
使用配置文件:
<facilities>

    
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />

</facilities>
2.加入组件时指定使用的是哪种方式
如果使用访问器只需要指定访问器的名称就可以了:
<component id="accessor.comp" 

    type
="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"

    instance-accessor
="Instance">

</component>
如果使用工厂方法,需要指定工厂ID和工厂方法:
<component id="mycomp" 

            type
="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory" factoryCreate="Create">

</component>
四.常见的配置示例
这是一些常见的配置示例,来自于Castle自带的测试代码中。
1.访问器配置示例
有这样一个单件类
public class SingletonWithAccessor

{
    
private static readonly SingletonWithAccessor instance = new SingletonWithAccessor();

    
private SingletonWithAccessor()

    
{

    }


    
public static SingletonWithAccessor Instance

    
{
        
get return instance; }
    }

}
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    
<facilities>

        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />

    
</facilities>

    
<components>

        
<component id="accessor.comp" type="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"

            instance-accessor
="Instance"></component>

    
</components>

</configuration>
2.普通工厂配置示例
组件类和工厂类如下
public class MyComp

{
    
public MyComp()

    
{

    }

}


public class MyCompFactory

{
    
public MyComp Create()

    
{
        
return new MyComp();
    }

}
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    
<facilities>

        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />

    
</facilities>

    
<components>

        
<component id="mycompfactory" type="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory, Castle.Facilities.FactorySupport.Tests" />

        
<component id="mycomp" type="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"

            factoryId
="mycompfactory" factoryCreate="Create"></component>

    
</components>

</configuration>
3.带参工厂配置示例
组件类和工厂类如下:
public class MyComp

{
    
private string storeName;

    
private IDictionary props;

    
internal MyComp()
    
{

    }


    
internal MyComp(String storeName, IDictionary props)

    
{
        
this.storeName = storeName;

        
this.props = props;
    }


    
public string StoreName

    
{
        
get