Castle IOC容器内幕故事(三)

摘要:上一篇文章我们了解了Castle IOC中注册组件的流程,为了更好的使用Castle IOC,本篇文章我们介绍一下Castle IOC中的几个重要的角色,开始Castle IOC容器内幕故事下角色介绍。

 

主要内容

1ComponentModelBuilder Contributors

2Contributors分析

3Handles分析

4ComponentActivator分析

 

一.ComponentModelBuilder Contributors

在前一篇中介绍组件的注册流程时说到了,创建ComponentModel的过程就是调用contributor来对组件进行处理的过程。Contributor就是我们这个内幕故事的第一个主角,在DefaultComponentModelBuilder一共注册了八个Contributor每一个Contributor都专门负责处理某一方面的事情。如下代码所示:

protected   virtual   void  InitializeContributors()

ExpandedBlockStart.gifContractedBlock.gif
{

    AddContributor( 
new ConfigurationModelInspector() );

    AddContributor( 
new LifestyleModelInspector() );

    AddContributor( 
new ConstructorDependenciesModelInspector() );

    AddContributor( 
new PropertiesDependenciesModelInspector() );

    AddContributor( 
new MethodMetaInspector() );

    AddContributor( 
new LifecycleModelInspector() );

    AddContributor( 
new ConfigurationParametersInspector() );

    AddContributor( 
new InterceptorInspector() );

}


//   http://terrylee.cnblogs.com


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

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

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

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

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

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

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

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

在有些情况下,我们可能并不需要这么多的Contributors,或者说我们想添加自定义的Contributors,可以用ComponentModelBuilder的如下两个方法来实现对Contributors的管理:

public   void  AddContributor(IContributeComponentModelConstruction contributor)

ExpandedBlockStart.gifContractedBlock.gif
{

    contributors.Add(contributor);

}


public   void  RemoveContributor(IContributeComponentModelConstruction contributor)

ExpandedBlockStart.gifContractedBlock.gif
{

    contributors.Remove(contributor);

}


//   http://terrylee.cnblogs.com


二. Contributors 分析

 

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

public   interface  IContributeComponentModelConstruction
ExpandedBlockStart.gifContractedBlock.gif
{
    
void ProcessModel(IKernel kernel, ComponentModel model);

}

//   http://terrylee.cnblogs.com

来看一下其中LifecycleModelInspector的实现代码:

[Serializable]
public   class  LifecycleModelInspector : IContributeComponentModelConstruction
ExpandedBlockStart.gifContractedBlock.gif
{
    
public LifecycleModelInspector()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{

    }


    
public virtual void ProcessModel(IKernel kernel, ComponentModel model)

ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if (typeof (IInitializable).IsAssignableFrom(model.Implementation))

ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            model.LifecycleSteps.Add( LifecycleStepType.Commission, InitializationConcern.Instance );

        }

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

        }

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

        }

    }

}

//   http://terrylee.cnblogs.com


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

三.Handles分析

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

public   enum  HandlerState
ExpandedBlockStart.gifContractedBlock.gif
{
    Valid,

    WaitingDependency
}


public   interface  IHandler
ExpandedBlockStart.gifContractedBlock.gif
{
    
void Init(IKernel kernel);

    
object Resolve();

    
void Release(object instance);

ExpandedSubBlockStart.gifContractedSubBlock.gif    HandlerState CurrentState 
get; }

ExpandedSubBlockStart.gifContractedSubBlock.gif    ComponentModel ComponentModel 
get; }

}

//   http://terrylee.cnblogs.com

Handles通过下面两个方法来检查哪些组件可以被请求,而哪些组件需要继续等待相关依赖,但是它并不做具体的组件创建工作。

public   override   object  Resolve()
ExpandedBlockStart.gifContractedBlock.gif
{
    
if (CurrentState == HandlerState.WaitingDependency)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        String message 
= 

            String.Format(
"Can't create component '{1}' as it has dependencies to be satisfied. {0}"

                ObtainDependencyDetails(), ComponentModel.Name );
 
        
throw new HandlerException(message);
    }
   
    
return lifestyleManager.Resolve();
}


public   override   void  Release( object  instance)
ExpandedBlockStart.gifContractedBlock.gif
{
    lifestyleManager.Release( instance );
}

//   http://terrylee.cnblogs.com

 

四.ComponentActivator分析

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

[Serializable]
public   abstract   class  AbstractComponentActivator : IComponentActivator
ExpandedBlockStart.gifContractedBlock.gif
{
    
private IKernel kernel;

    
private ComponentModel model; 

    
private ComponentInstanceDelegate onCreation;

    
private ComponentInstanceDelegate onDestruction;

    
public AbstractComponentActivator(ComponentModel model, IKernel kernel, 

        ComponentInstanceDelegate onCreation, 

        ComponentInstanceDelegate onDestruction)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
this.model = model;

        
this.kernel = kernel;

        
this.onCreation = onCreation;

        
this.onDestruction = onDestruction;
    }


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

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


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


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


    
protected abstract object InternalCreate();

    
protected abstract void InternalDestroy(object instance);

ContractedSubBlock.gifExpandedSubBlockStart.gif    
IComponentActivator Members#region IComponentActivator Members

    
public virtual object Create()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
object instance = InternalCreate();

        onCreation(model, instance);

        
return instance;

    }


    
public virtual void Destroy(object instance)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        InternalDestroy(instance);

        onDestruction(model, instance);

    }

    
#endregion


}

//   http://terrylee.cnblogs.com

 

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

转载于:https://www.cnblogs.com/Madream/articles/1680447.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
IoC (Inversion of Control,控制反转)是一种设计模式,它将程序中的控制权从代码中转移到了容器中,使得程序的可扩展性和可维护性更强。IoC 容器就是实现 IoC 模式的一个工具,它可以自动创建、装配和管理对象,从而简化了应用程序的开发和维护。 在 C# 中,有很多开源的 IoC 容器可供选择,比如 Unity、Autofac、Castle Windsor 等。这些 IoC 容器都有一个共同的特点,就是它们提供了一种机制,可以将应用程序中的对象的创建、装配和生命周期管理交给容器来完成,从而减少了应用程序代码的耦合性。开发人员只需要在应用程序中声明依赖关系和对象的生命周期要求,IoC 容器就可以自动完成对象的创建和装配。 以下是一个使用 Autofac IoC 容器的示例代码: ``` // 定义服务接口和实现类 public interface IService { void DoSomething(); } public class ServiceImpl : IService { public void DoSomething() { Console.WriteLine("Service is doing something."); } } // 注册服务到容器中 var builder = new ContainerBuilder(); builder.RegisterType<ServiceImpl>().As<IService>(); var container = builder.Build(); // 从容器中获取服务实例并调用方法 var service = container.Resolve<IService>(); service.DoSomething(); ``` 上面的代码中,我们首先定义了一个 IService 接口和一个 ServiceImpl 实现类。然后,使用 Autofac 的 ContainerBuilder 类将 ServiceImpl 类注册为 IService 接口的实现类。最后,使用容器的 Resolve 方法从容器中获取 IService 接口的实例,并调用其 DoSomething 方法。 使用 IoC 容器可以使应用程序更加灵活和可扩展,因为它可以动态地创建和管理对象,从而减少了代码的耦合性。但是,开发人员也需要注意 IoC 容器的使用和配置,以确保应用程序的性能和可维护性。同时,由于 IoC 容器需要在应用程序启动时初始化,因此它可能会对应用程序的启动时间产生一定的影响。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值