Castle IOC容器实践之TypedFactory Facility(二)

摘要:在Castle IOC容器实践之TypedFactory Facility(一)里面大家都已经知道了如何去使用TypedFactory Facility,也已经体会到它的方便之处了,为了更好的使用它,本篇我们对TypedFactory Facility的原理做一些简单的分析。

 

主要内容

TypedFactory Facility原理分析

……

 

TypedFactory Facility中,有一个FactoryEntry类,这个类与我们平时项目开发中的实体类有一些类似,它用来记录工厂的相关信息,包括工厂的ID,工厂的接口,创建方法和销毁方法。这个类实现如下:
Castle IOC容器实践之TypedFactory Facility(二)public class FactoryEntry
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    
private String _id;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
private Type _factoryInterface;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
private String _creationMethod;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
private String _destructionMethod;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public FactoryEntry(String id, Type factoryInterface, String creationMethod, String destructionMethod)
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
// Castle IOC容器实践之TypedFactory Facility(二)Castle IOC容器实践之TypedFactory Facility(二)省略了验证及异常处理
Castle IOC容器实践之TypedFactory Facility(二)

Castle IOC容器实践之TypedFactory Facility(二)        _id 
= id;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        _factoryInterface 
= factoryInterface;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        _creationMethod 
= creationMethod;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        _destructionMethod 
= destructionMethod;
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public String Id
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
get return _id; }
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public Type FactoryInterface
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
get return _factoryInterface; }
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public String CreationMethod
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
get return _creationMethod; }
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public String DestructionMethod
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
get return _destructionMethod; }
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)}
TypedFactoryFacility同样是继承于AbstractFacility,关于Facility的继承关系我在前面的文章中已经说过了。TypedFactory Facility在初始化的时候首先会获取工厂的类型,通过SubSystem来得到:
Castle IOC容器实践之TypedFactory Facility(二)protected override void Init()
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    Kernel.AddComponent( 
"typed.fac.interceptor"typeof(FactoryInterceptor) );
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    ITypeConverter converter 
= (ITypeConverter)
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        Kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    AddFactories(FacilityConfig, converter);
Castle IOC容器实践之TypedFactory Facility(二)}

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)
protected virtual void AddFactories(IConfiguration facilityConfig, ITypeConverter converter)
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    
if (facilityConfig != null)
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        
foreach(IConfiguration config in facilityConfig.Children["factories"].Children)
Castle IOC容器实践之TypedFactory Facility(二)        
{
Castle IOC容器实践之TypedFactory Facility(二)            String id 
= config.Attributes["id"];
Castle IOC容器实践之TypedFactory Facility(二)            String creation 
= config.Attributes["creation"];
Castle IOC容器实践之TypedFactory Facility(二)            String destruction 
= config.Attributes["destruction"];
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)            Type factoryType 
= (Type)
Castle IOC容器实践之TypedFactory Facility(二)                converter.PerformConversion( config.Attributes[
"interface"], typeof(Type) );
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)            
try
Castle IOC容器实践之TypedFactory Facility(二)            
{
Castle IOC容器实践之TypedFactory Facility(二)                AddTypedFactoryEntry( 
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)                    
new FactoryEntry(id, factoryType, creation, destruction) );
Castle IOC容器实践之TypedFactory Facility(二)            }

Castle IOC容器实践之TypedFactory Facility(二)            
catch(Exception ex)
Castle IOC容器实践之TypedFactory Facility(二)            
{
Castle IOC容器实践之TypedFactory Facility(二)                
throw new ConfigurationException("Invalid factory entry in configuration", ex);
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)            }

Castle IOC容器实践之TypedFactory Facility(二)        }

Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)}
然后再创建一个FactoryEntry实例,记录了工厂的信息,放在了ComponentModel的扩展属性ExtendedProperties中,设置ComponentModel的生命周期为Singleton
Castle IOC容器实践之TypedFactory Facility(二)public void AddTypedFactoryEntry( FactoryEntry entry )
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    ComponentModel model 
= 
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        
new ComponentModel(entry.Id, entry.FactoryInterface, typeof(Empty));
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    model.LifestyleType 
= LifestyleType.Singleton;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    model.ExtendedProperties[
"typed.fac.entry"= entry;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    model.Interceptors.Add( 
new InterceptorReference( typeof(FactoryInterceptor) ) );
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    Kernel.AddCustomComponent( model );
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)}
在容器中加入一个工厂接口的拦截器FactoryInterceptor,当从容器中获取工厂时,会被拦截器拦截,拦截器的实现如下:
Castle IOC容器实践之TypedFactory Facility(二)[Transient]
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)
public class FactoryInterceptor : IMethodInterceptor, IOnBehalfAware
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    
private FactoryEntry _entry;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
private IKernel _kernel;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public FactoryInterceptor(IKernel kernel)
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        _kernel 
= kernel;
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public void SetInterceptedComponentModel(ComponentModel target)
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        _entry 
= (FactoryEntry) target.ExtendedProperties["typed.fac.entry"];
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
public object Intercept(IMethodInvocation invocation, params object[] args)
Castle IOC容器实践之TypedFactory Facility(二)    
{
Castle IOC容器实践之TypedFactory Facility(二)        String name 
= invocation.Method.Name;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        
if (name.Equals(_entry.CreationMethod))
Castle IOC容器实践之TypedFactory Facility(二)        
{
Castle IOC容器实践之TypedFactory Facility(二)            
if (args.Length == 0 || args[0== null)
Castle IOC容器实践之TypedFactory Facility(二)            
{
Castle IOC容器实践之TypedFactory Facility(二)                
return _kernel[ invocation.Method.ReturnType ];
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)            }

Castle IOC容器实践之TypedFactory Facility(二)            
else
Castle IOC容器实践之TypedFactory Facility(二)            
{
Castle IOC容器实践之TypedFactory Facility(二)                
return _kernel[ (String) args[0] ];
Castle IOC容器实践之TypedFactory Facility(二)            }

Castle IOC容器实践之TypedFactory Facility(二)        }

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        
else if (name.Equals(_entry.DestructionMethod))
Castle IOC容器实践之TypedFactory Facility(二)        
{
Castle IOC容器实践之TypedFactory Facility(二)            
if (args.Length == 1)
Castle IOC容器实践之TypedFactory Facility(二)            
{
Castle IOC容器实践之TypedFactory Facility(二)                _kernel.ReleaseComponent( args[
0] );
Castle IOC容器实践之TypedFactory Facility(二)                
return null;
Castle IOC容器实践之TypedFactory Facility(二)            }

Castle IOC容器实践之TypedFactory Facility(二)        }
        
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)        
return invocation.Proceed(args);
Castle IOC容器实践之TypedFactory Facility(二)    }

Castle IOC容器实践之TypedFactory Facility(二)}
还有一点需要我们注意的是在上面实例化ComponentModel的时候用到了一个Empty类,这个类是一个空类,没有任何实现:
Castle IOC容器实践之TypedFactory Facility(二)public class Empty
Castle IOC容器实践之TypedFactory Facility(二)

Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)}
在实例化ComponentModel时需要传入的几个参数是:
Castle IOC容器实践之TypedFactory Facility(二)public ComponentModel(String name, Type service, Type implementation)
Castle IOC容器实践之TypedFactory Facility(二)
{
Castle IOC容器实践之TypedFactory Facility(二)    
this.name = name;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
this.service = service;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
this.implementation = implementation;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)    
this.lifestyleType = LifestyleType.Undefined;
Castle IOC容器实践之TypedFactory Facility(二)
Castle IOC容器实践之TypedFactory Facility(二)}
即这里用一个空的类型来代替实现了的类型。















本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67689 ,如需转载请自行联系原作者
上一篇:阿里云副总裁孙磊:Game Master,赋予游戏新智慧


下一篇:阿里云EMR产品介绍及常见问题解答