Castle IOC容器内幕故事(下)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:上一篇文章我们了解了Castle IOC中注册组件的流程,为了更好的使用Castle IOC,本篇文章我们介绍一下Castle IOC中的几个重要的角色,开始Castle IOC容器内幕故事下角色介绍。

 

主要内容

1 ComponentModelBuilder  Contributors

2 Contributors分析

3 Handles分析

4 ComponentActivator分析

 

一.ComponentModelBuilder 和 Contributors

在前一篇中介绍组件的注册流程时说到了,创建 ComponentModel 的过程就是调用contributor来对组件进行处理的过程。Contributor就是我们这个内幕故事的第一个主角,在DefaultComponentModelBuilder一共注册了八个Contributor 每一个Contributor都专门负责处理某一方面的事情。如下代码所示:
None.gif protected   virtual   void  InitializeContributors()
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    AddContributor( 
new ConfigurationModelInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new LifestyleModelInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new ConstructorDependenciesModelInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new PropertiesDependenciesModelInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new MethodMetaInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new LifecycleModelInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new ConfigurationParametersInspector() );
InBlock.gif
InBlock.gif    AddContributor( 
new InterceptorInspector() );
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
//   [url]http://terrylee.cnblogs.com[/url]

1 ConfigurationModelInspector:用来处理配置,它使用ConfigurationStoreKernel中注册来保持一个组件的连接。

2 LifestyleModelInspector :生命周期处理方式,主要有SingletonThreadTransientPooledCustom这些都可以在配置文件中指定,后续文章会讲到。

3 ConstructorDependenciesModelInspector:处理构造函数依赖,收集所有的Public构造函数,并它们交给ComponentModelConstructors集合。

4 PropertiesDependenciesModelInspector:处理属性依赖,收集所有的可写的属性,Kernel也许不会在组件注册时就设置所有的属性,也有可能在请求获取组件时来设置。

5 MethodMetaInspector:检测组件配置中的Method节点,每一个节点都将添加到ComponentModelMethod集合中。

6 LifecycleModelInspector:处理组件生命周期,即在组件装载,初始化,销毁所出发的行为,分别对应三个接口:IInitializable,ISupportInitialize,IDisposable,如果组件实现了这些接口,容器会自动在不同的生命周期调用它们。

7 ConfigurationParametersInspector:处理配置文件中的parameters元素内容,每一个parameters都将创建一个ParameterModel,并添加到ComponentModelParameters集合中。

8 InterceptorInspector:处理InterceptorAttribute或者配置文件中的interceptors元素的信息。

在有些情况下,我们可能并不需要这么多的Contributors,或者说我们想添加自定义的Contributors,可以用ComponentModelBuilder的如下两个方法来实现对Contributors的管理:
None.gif public   void  AddContributor(IContributeComponentModelConstruction contributor)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    contributors.Add(contributor);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
public   void  RemoveContributor(IContributeComponentModelConstruction contributor)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    contributors.Remove(contributor);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
//   [url]http://terrylee.cnblogs.com[/url]

二. Contributors 分析

 
通过上面的分析可以看到 八个Contributors按一定顺序组合构成了整个组件的处理流程,现在我们来看一下Contributors是如何实现的?每一个Contributors都必须实现于接口IcontributeComponentModelConstruction,通过这个,我们可以创建自己的Contributors

None.gif public   interface  IContributeComponentModelConstruction
ExpandedBlockStart.gif
{
InBlock.gif    
void ProcessModel(IKernel kernel, ComponentModel model);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
//   [url]http://terrylee.cnblogs.com[/url]
None.gif
来看一下其中 LifecycleModelInspector 的实现代码:

None.gif [Serializable]
None.gif
public   class  LifecycleModelInspector : IContributeComponentModelConstruction
ExpandedBlockStart.gif
{
InBlock.gif    
public LifecycleModelInspector()
ExpandedSubBlockStart.gif    
{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public virtual void ProcessModel(IKernel kernel, ComponentModel model)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif        
if (typeof (IInitializable).IsAssignableFrom(model.Implementation))
InBlock.gif
ExpandedSubBlockStart.gif        
{
InBlock.gif            model.LifecycleSteps.Add( LifecycleStepType.Commission, InitializationConcern.Instance );
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (typeof (ISupportInitialize).IsAssignableFrom(model.Implementation))
ExpandedSubBlockStart.gif        
{
InBlock.gif            model.LifecycleSteps.Add( LifecycleStepType.Commission, SupportInitializeConcern.Instance );
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (typeof (IDisposable).IsAssignableFrom(model.Implementation))
ExpandedSubBlockStart.gif        
{
InBlock.gif            model.LifecycleSteps.Add( LifecycleStepType.Decommission, DisposalConcern.Instance );
InBlock.gif
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
//   [url]http://terrylee.cnblogs.com[/url]
None.gif

至此,第一个主角 Contributors的故事就完了。

三.Handles分析

在组件注册流程中,还提到了一个重要的角色就是Handles。对Handles的描述引用Castle官方网站的一句话来说就是“They don't construct the component themselves, but they know who does”。Handles它有两个状态,分别标识组件是否可以被请求还是需要继续等待相关的依赖,所有的Handles都必须实现IHandles接口,通过这个也可以创建自己的Handle

None.gif public   enum  HandlerState
ExpandedBlockStart.gif
{
InBlock.gif    Valid,
InBlock.gif
InBlock.gif    WaitingDependency
ExpandedBlockEnd.gif}

None.gif
None.gif
public   interface  IHandler
ExpandedBlockStart.gif
{
InBlock.gif    
void Init(IKernel kernel);
InBlock.gif
InBlock.gif    
object Resolve();
InBlock.gif
InBlock.gif    
void Release(object instance);
InBlock.gif
ExpandedSubBlockStart.gif    HandlerState CurrentState 
get; }
InBlock.gif
ExpandedSubBlockStart.gif    ComponentModel ComponentModel 
get; }
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
//   [url]http://terrylee.cnblogs.com[/url]
Handles 通过下面两个方法来检查哪些组件可以被请求,而哪些组件需要继续等待相关依赖,但是它并不做具体的组件创建工作。

None.gif public   override   object  Resolve()
ExpandedBlockStart.gif
{
InBlock.gif    
if (CurrentState == HandlerState.WaitingDependency)
ExpandedSubBlockStart.gif    
{
InBlock.gif        String message 
= 
InBlock.gif
InBlock.gif            String.Format(
"Can't create component '{1}' as it has dependencies to be satisfied. {0}"
InBlock.gif
InBlock.gif                ObtainDependencyDetails(), ComponentModel.Name );
InBlock.gif 
InBlock.gif        
throw new HandlerException(message);
ExpandedSubBlockEnd.gif    }
   
InBlock.gif    
return lifestyleManager.Resolve();
ExpandedBlockEnd.gif}

None.gif
None.gif
public   override   void  Release( object  instance)
ExpandedBlockStart.gif
{
InBlock.gif    lifestyleManager.Release( instance );
ExpandedBlockEnd.gif}

None.gif
//   [url]http://terrylee.cnblogs.com[/url]
 
四.ComponentActivator分析

介绍完前面三位角色之后,今天最后一位登场的主角就是ComponentActivator,组件激活器。每一个组件都和一个Activator相关联。Castle IOC为我们提供了默认的ActivatorCastle IOC已经为我们提供了默认的Activator,但有时候也需要自己去实现Activator,比如说创建组件的实例并不是new出来的,而是通过我们自定义的Factory方法创建的,或者说我们需要创建的组件一个Remoting组件。创建自定义的Activator需要继承于AbstractComponentActivator基类或者DefaultComponentActivator

None.gif [Serializable]
None.gif
public   abstract   class  AbstractComponentActivator : IComponentActivator
ExpandedBlockStart.gif
{
InBlock.gif    
private IKernel kernel;
InBlock.gif
InBlock.gif    
private ComponentModel model; 
InBlock.gif
InBlock.gif    
private ComponentInstanceDelegate onCreation;
InBlock.gif
InBlock.gif    
private ComponentInstanceDelegate onDestruction;
InBlock.gif
InBlock.gif    
public AbstractComponentActivator(ComponentModel model, IKernel kernel, 
InBlock.gif
InBlock.gif        ComponentInstanceDelegate onCreation, 
InBlock.gif
InBlock.gif        ComponentInstanceDelegate onDestruction)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
this.model = model;
InBlock.gif
InBlock.gif        
this.kernel = kernel;
InBlock.gif
InBlock.gif        
this.onCreation = onCreation;
InBlock.gif
InBlock.gif        
this.onDestruction = onDestruction;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public IKernel Kernel
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return kernel; }
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public ComponentModel Model
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return model; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public ComponentInstanceDelegate OnCreation
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return onCreation; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public ComponentInstanceDelegate OnDestruction
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockStart.gif        
get return onDestruction; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
protected abstract object InternalCreate();
InBlock.gif
InBlock.gif    
protected abstract void InternalDestroy(object instance);
InBlock.gif
ContractedSubBlock.gif    
IComponentActivator Members
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
//   [url]http://terrylee.cnblogs.com[/url]
 
关于Castle IOC内部主角分析就到这里了,至此Castle IOC的内幕故事也告一段落了,通过这两篇文章我们对Castle IOC的内幕有了一个简单的认识,这对于我们使用Castle IOC有很大的好处,后续文章会讲到。

参考资料

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













本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67675  ,如需转载请自行联系原作者

相关文章
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
2月前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
46 0
|
1月前
|
存储 前端开发 Java
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (下)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界
|
1月前
|
XML Java 数据格式
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 (上)
|
3月前
|
XML Java 数据格式
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
Spring5源码(15)-IoC容器启动过程简析及XmlBeanFactory初始化
31 1
|
3月前
|
XML Java 数据格式
Spring5源码(12)-IoC容器简介
Spring5源码(12)-IoC容器简介
32 1
|
3天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
4天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
17 1
|
9天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。