摘要:FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:

1.使用访问器来访问组件的实例

2.使用静态方法或者实例方式来访问组件的实例

 

主要内容

1.概述

2.为什么需要FactorySupport Facility

3.如何使用

4.常见的配置示例

5.实现原理浅析

 

一.概述

FactorySupport Facility允许我们使用已经存在的工厂来创建组件的实例,可以把已经存在的对象模型加入到容器中,以便它能够使用自动装配。它使用了以下两种处理策略:

1.通过访问器来访问组件的实例

2.通过静态方法或者实例方式来访问组件的实例

二.为什么需要FactorySupport Facility

为了回答这个问题,我们先来看一个简单的使用工厂的例子,如下代码所示:

Castle IOC容器实践之FactorySupport Facilitypublic interface IComponent 
Castle IOC容器实践之FactorySupport Facility
}

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

Castle IOC容器实践之FactorySupport Facilitypublic class App
Castle IOC容器实践之FactorySupport Facility
}

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

Castle IOC容器实践之FactorySupport Facilitypublic interface IComponent 
Castle IOC容器实践之FactorySupport Facility
}

配置文件,现在你可以不用理解怎么去配置,后面会讲到。

Castle IOC容器实践之FactorySupport Facility<?xml version="1.0" encoding="utf-8" ?>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
<configuration>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="myfactory" type="FactorySupportDemo.MyFactory,FactorySupportDemo" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="mycomp" type="FactorySupportDemo.MyComponent,FactorySupportDemo"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            factoryId
="myfactory" factoryCreate="Create"></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</configuration>

使用组件的实例

Castle IOC容器实践之FactorySupport Facilitypublic class App
Castle IOC容器实践之FactorySupport Facility
}

看到了吗?我们并没有使用new关键字创建任何对象,只是把工厂、组件等通过配置文件抛给了IOC容器,再从容器中往外取的时候,就可以直接取到组件的实例,这些实例是由工厂自动创建的,这正是FactorySupport Facility的作用。

三.如何使用

知道了为什么需要FactorySupport Facility之后,下面就来看如何使用Facility。在前面的代码中大家都已经看到了,使用FactorySupport Facility是非常的简单。

1.加入FactorySupport Facility到容器中,可以使用代码加入也可以使用配置文件。

使用代码加入:

Castle IOC容器实践之FactorySupport FacilityIWindsorContainer container = new WindsorContainer("../../Basic.xml");
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facilitycontainer.AddFacility(
"factorysupport",new Castle.Facilities.FactorySupport.FactorySupportFacility());

使用配置文件:

Castle IOC容器实践之FactorySupport Facility<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</facilities>

2.加入组件时指定使用的是哪种方式

如果使用访问器只需要指定访问器的名称就可以了:

Castle IOC容器实践之FactorySupport Facility<component id="accessor.comp" 
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    type
="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    instance-accessor
="Instance">
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</component>

如果使用工厂方法,需要指定工厂ID和工厂方法:

Castle IOC容器实践之FactorySupport Facility<component id="mycomp" 
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            type
="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            factoryId
="mycompfactory" factoryCreate="Create">
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</component>

四.常见的配置示例

这是一些常见的配置示例,来自于Castle自带的测试代码中。

1.访问器配置示例

有这样一个单件类

Castle IOC容器实践之FactorySupport Facilitypublic class SingletonWithAccessor
Castle IOC容器实践之FactorySupport Facility
}

配置文件如下:

Castle IOC容器实践之FactorySupport Facility<?xml version="1.0" encoding="utf-8" ?>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
<configuration>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="accessor.comp" type="Castle.Facilities.FactorySupport.Tests.Components.SingletonWithAccessor, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            instance-accessor
="Instance"></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</configuration>

2.普通工厂配置示例

组件类和工厂类如下

Castle IOC容器实践之FactorySupport Facilitypublic class MyComp
Castle IOC容器实践之FactorySupport Facility
}

配置文件如下:

Castle IOC容器实践之FactorySupport Facility<?xml version="1.0" encoding="utf-8" ?>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
<configuration>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="mycompfactory" type="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory, Castle.Facilities.FactorySupport.Tests" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="mycomp" type="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            factoryId
="mycompfactory" factoryCreate="Create"></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</configuration>

3.带参工厂配置示例

组件类和工厂类如下:

Castle IOC容器实践之FactorySupport Facilitypublic class MyComp
Castle IOC容器实践之FactorySupport Facility
}

配置文件如下:

Castle IOC容器实践之FactorySupport Facility<?xml version="1.0" encoding="utf-8" ?>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
<configuration>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility       
<component id="mycompfactory" type="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory2, Castle.Facilities.FactorySupport.Tests"></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="mycomp" type="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            factoryId
="mycompfactory" factoryCreate="Create">
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            
<parameters>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                
<storeName>MyStore</storeName>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                
<props>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                    
<dictionary>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                        
<entry key="key1">item1</entry>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                        
<entry key="key2">item2</entry>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                    
</dictionary>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility                
</props>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            
</parameters>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
</component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</configuration>

4.使用自动装配工厂配置示例

组件类和工厂类如下:

Castle IOC容器实践之FactorySupport Facilitypublic interface IMyService
Castle IOC容器实践之FactorySupport Facility
}

配置文件如下:

Castle IOC容器实践之FactorySupport Facility<?xml version="1.0" encoding="utf-8" ?>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
<configuration>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</facilities>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
<components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="myserv" service="Castle.Facilities.FactorySupport.Tests.Components.IMyService, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            type
="Castle.Facilities.FactorySupport.Tests.Components.DefaultMyService, Castle.Facilities.FactorySupport.Tests" />
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility       
<component id="mycompfactory" type="Castle.Facilities.FactorySupport.Tests.Components.MyCompFactory3, Castle.Facilities.FactorySupport.Tests"></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility        
<component id="mycomp" type="Castle.Facilities.FactorySupport.Tests.Components.MyComp, Castle.Facilities.FactorySupport.Tests"
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            factoryId
="mycompfactory" factoryCreate="Create">
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility            
<!-- parameters is not necessary_u97 ?s it will auto wire --></component>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility    
</components>
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
</configuration>

五.实现原理浅析

FactorySupport Facility的实现也是非常的简单,主要是通过两个ComponentActivator来实现,分别为AccessorActivatorFactoryActivator,根据配置文件的不同调用不同的Activator

Castle IOC容器实践之FactorySupport FacilityString instanceAccessor = model.Configuration.Attributes["instance-accessor"];
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport FacilityString factoryId 
= model.Configuration.Attributes["factoryId"];
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport FacilityString factoryCreate 
= model.Configuration.Attributes["factoryCreate"];
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
Castle IOC容器实践之FactorySupport Facility
if (instanceAccessor != null)
Castle IOC容器实践之FactorySupport Facility
}

好了,关于FactorySupport Facility就介绍到这儿,更多Castle的文章您可以访问《Castle 开发系列文章》。

 

PDF版本下载/Files/Terrylee/FactorySupportFacility.rar

示例代码下载/Files/Terrylee/FactorySupportDemo.rar

 

参考资料

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

(出处:博客园http://terrylee.cnblogs.com

相关文章: