Castle实践6-TypedFactory Facility

如何在Castle IOC中使用工厂呢?本节就是你所要的,你会觉得在Castle IOC中使用工厂是件多么容易的事情,并且是高灵活度,低耦合的。 lucky.gif

【使用篇】
1)定义一个产品接口
public   interface  IProduct
{dot.gifdot.gif}


2)实现一个或者多个产品类

public   class  ConcreteProduct1 : IProduct
{dot.gifdot.gif}

public   class  ConcreteProduct2 : IProduct
{dot.gifdot.gif}

3) 定义一个工厂接口
public   interface  IProductFactory
{
    
//  生产方法
    IProduct Create(String key);
    
//  销毁方法
     void  Release(IProduct handler);
}

4)定义一个配置文件
< configuration >
    
< facilities >
        
< facility  id ="typedfactory" >
            
< factories >
                
< factory  id ="productFactory"  interface ="TypedFactoryDemo.IProductFactory, TypedFactoryDemo"
                    creation
="Create"  destruction ="Release"   />
            
</ factories >
        
</ facility >
    
</ facilities >
</ configuration >

5)初始化容器
//  初始化一个容器
IWindsorContainer container  =   new  WindsorContainer( " typedFactory_config.xml "  );
//  加入Facility
container.AddFacility(  " typedfactory " new  TypedFactoryFacility() );
//  加入产品
container.AddComponent(  " prod1 " typeof (IProduct),  typeof (ConcreteProduct1) );
container.AddComponent( 
" prod2 " typeof (IProduct),  typeof (ConcreteProduct2) );

6)使用工厂
//  从容器中获取工厂
IProductFactory factory  =  (IProductFactory)container[ " productFacotry " ];
//  进行生产
IProduct prod1  =  factory.Create( " prod1 " );  // prod1 is ConcreteProduct1
IProduct prod2 
=  factory.Create( " prod2 " );  // prod2 is ConcreteProduct2


        OK! 你不需要写任何的具体的工厂方法,也不用new任何一个具体的产品。增加一个工厂或者是增加一个产品,是不是很简单呢?想知道其中的奥秘吧,那请你继续往下看。

【原理篇】
        这个Facility中有一个叫FactoryEntry的类,专门是用来收集初始化的工厂信息的。包括工厂ID、工厂接口、工厂的创建产品方法和工厂的销毁产品方法。
        而在TypedFactoryFacility中,容器首先对配置的工厂初始化一个FactoryEntry工厂信息库放到工厂Model的ExtendedProperties中,然后容器会加入一个工厂接口的拦截器FactoryInterceptor,当从容器中获取一个工厂的时候,就会被拦截器拦截。
        在拦截器的处理里面会自动根据工厂的创建方法名称(FactoryEntry.CreationMethod)来向容器中索取一个产品对象。又或者是销毁方法名称(FactoryEntry.DestructionMethod)在容器中ReleaseComponent一个产品对象。

除此之外,你还可以这样定义工厂接口:
public   interface  IProductFactory
{
    
//  生产方法
    ConcreteProduct Create();
}

如果你想要自己的工厂生产方法,那也完全没问题,只要你实现自己的工厂方法而方法的名称和配置文件中的creation或者destruction指定的方法名称不同就可以了。

【后记】
此外,在看源码过程中,有两处是值得探讨的。由于前项目阶段性完成,今天要回深圳,所以我就贴出来让大家看下,一起研究研究。xixi :)
//  是这样得到工厂类型的
ITypeConverter converter  =  (ITypeConverter)_kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
Type factoryType 
=  (Type)converter.PerformConversion( config.Attributes[ " interface " ],  typeof (Type) );

dot.gifdot.gif

//  Empty 是个空类哦~
ComponentModel model  =   new  ComponentModel(entry.Id, entry.FactoryInterface,  typeof (Empty));

see you then~ 14.gif

转载于:https://www.cnblogs.com/laiwen/archive/2005/09/07/231645.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值