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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介:



摘要:在Castle IOC容器实践之Startable Facility(一)中我们已经学会了如何去使用Startable Facility,本文将在此基础进一步对它的原理做一些分析。

 
主要内容
Startable Facility 原理分析
……
 
Castle IOC容器实践之Startable Facility(一)中我们已经看到了如何去使用Startable Facility,本文将对它的原理做一些分析。先看一下接口IStartable,它的实现代码如下:
public   interface  IStartable
{
    
void Start();

    
void Stop();
}

代码是相当的简单,只有两个方法,分别在组件创建的时候和销毁的时候执行,这就涉及到了组件的生命周期管理。在 Windsor中,接口 ILifecycleConcern 提供特定的组件生命周期管理:
public   interface  ILifecycleConcern
{
    
void Apply( ComponentModel model, object component );

}

现在我们要实现组件的自动创建和销毁,就需要实现接口 ILifecycleConcern ,在 Startable Facility 中分别用两个类来实现,第一个类StartConcern,它判断如果组件实现了接口IStartable,则直接调用它的Start()方法;如果组件是用特性startMethod,则获取并调用具有startMethod特性的方法:
public   class  StartConcern : ILifecycleConcern
{
    
private static readonly StartConcern _instance = new StartConcern();

    
protected StartConcern()
    
{

    }


    
public static StartConcern Instance
    
{
        
get return _instance; }
    }


    
public void Apply(ComponentModel model, object component)
    
{
        
if (component is IStartable)
        
{
            (component 
as IStartable).Start();
        }

        
else if (model.Configuration != null)
        
{
            String startMethod 
= model.Configuration.Attributes["startMethod"];
 
            
if (startMethod != null)
            
{

                MethodInfo method 
= model.Implementation.GetMethod(startMethod);

                method.Invoke(component, 
null);
            }

        }

    }

}

第二个类是 StopConcern ,它判断如果组件实现了接口IStartable,则直接调用它的Stop()方法;如果组件是用特性stopMethod,则获取并调用具有stopMethod特性的方法:
public   class  StopConcern : ILifecycleConcern
{
    
private static readonly StopConcern _instance = new StopConcern();

    
protected StopConcern()
    
{

    }


    
public static StopConcern Instance
    
{
        
get return _instance; }
    }


    
public void Apply(ComponentModel model, object component)
    
{
        
if(component is IStartable)
        
{
            (component 
as IStartable).Stop();
        }

        
else if (model.Configuration != null)
        
{
            String stopMethod 
= model.Configuration.Attributes["stopMethod"];

            
if (stopMethod != null)
            
{
                MethodInfo method 
= model.Implementation.GetMethod(stopMethod);

                method.Invoke(component, 
null);
            }

        }

    }

}

好了,知道了 Startable Facility如何管理组件的生命周期,我们就来看看真正的 Startable Facility是如何实现的。每一个 Facility都是满足这样的一个继承关系:
1 Facility继承关系图
其中的Abstract Facility提供了一些默认的实现,Facility可以直接实现IFacility,也可以继承于Abstract FacilityIFacility的实现如下:
public   interface  IFacility
{
    
void Init(IKernel kernel, IConfiguration facilityConfig);


    
void Terminate();

}

那么到底如何让组件满足依赖性后就自动执行呢?注意到再 Startable FacilityInit()注册了这样的两个事件:
protected   override   void  Init()
{
    converter 
= (ITypeConverter) Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);


    Kernel.ComponentModelCreated 
+= 

        
new ComponentModelDelegate(OnComponentModelCreated);

    Kernel.ComponentRegistered 
+= 

        
new ComponentDataDelegate(OnComponentRegistered);

}
 
分别为OnComponentModelCreatedOnComponentRegistered。当我们注册一个组件时首先会出发OnComponentRegistered事件,在它里面判断组件是否满足依赖性,如果不满足,则添加到一个等待列表中,否则就直接启动,然后再对这个等待列表进行检测,看添加改组件后,列表中是否有组件满足了依赖性:
private   void  OnComponentRegistered(String key, IHandler handler)
{
    
bool startable = (bool) handler.ComponentModel.ExtendedProperties["startable"];

    
if (startable)
    
{
        
if (handler.CurrentState == HandlerState.WaitingDependency)
        
{
            waitList.Add( handler );
        }

        
else
        
{
            Start( key );
        }

    }


    CheckWaitingList();
}


private   void  CheckWaitingList()
{
    IHandler[] handlers 
= (IHandler[]) waitList.ToArray( typeof(IHandler) );

    IList validList 
= new ArrayList();

    
foreach(IHandler handler in handlers)
    
{
        
if (handler.CurrentState == HandlerState.Valid)
        
{
            validList.Add(handler);

            waitList.Remove(handler);
        }

    }


    
foreach(IHandler handler in validList)
    
{
        Start( handler.ComponentModel.Name );
    }

}

刚才说到,如果满足了依赖性,则会请求创建这个组件:
private   void  Start(String key)
{
    
object instance = Kernel[key];
}

这时就触发了 OnComponentModelCreated事件,这时就该用到开始我们所讲的那两生命周期处理的类了:
private   void  OnComponentModelCreated(ComponentModel model)
{
    
bool startable = 

        CheckIfComponentImplementsIStartable(model) 
|| HasStartableAttributeSet(model);

    model.ExtendedProperties[
"startable"= startable;

    
if (startable)
    
{
        model.LifecycleSteps.Add( 

            LifecycleStepType.Commission, StartConcern.Instance );

        model.LifecycleSteps.Add( 

            LifecycleStepType.Decommission, StopConcern.Instance );

    }

}

首先还是先判断组件是否实现了 IStartable接口或这时候有特性 startable,如果没有那也就不用自动启动了,否则就把 StartConcernStopConcern分别注册为组件的生命周期开始行为和生命周期结束行为,(关于组件的生命周期的详细内容可以参考我前面写的 Castle IOC容器组件生命周期管理)。此时组件进入生命周期开始,会调用 StartConcernApply()方法,这时就触发组件的 Start()方法,同样在组件销毁时调用 StopConcernApply()方法,这时就会调用组件的 Stop()方法。这样就完成整个了组件的自动执行与销毁的全过程。















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



相关文章
|
7天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2
|
8天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
9天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
10天前
|
存储 Kubernetes 调度
基于容器化技术的性能优化实践
基于容器化技术的性能优化实践
22 3
|
17天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
47 4
|
18天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
52 3
|
25天前
|
Kubernetes 监控 开发者
专家级实践:利用Cloud Toolkit进行微服务治理与容器化部署
【10月更文挑战第19天】在当今的软件开发领域,微服务架构因其高可伸缩性、易于维护和快速迭代的特点而备受青睐。然而,随着微服务数量的增加,管理和服务治理变得越来越复杂。作为阿里巴巴云推出的一款免费且开源的开发者工具,Cloud Toolkit 提供了一系列实用的功能,帮助开发者在微服务治理和容器化部署方面更加高效。本文将从个人的角度出发,探讨如何利用 Cloud Toolkit 来应对这些挑战。
35 2
|
1月前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
9天前
|
数据中心 开发者 Docker
理解并实践Docker容器化技术
理解并实践Docker容器化技术
|
1月前
|
运维 JavaScript 虚拟化
探索容器化技术:Docker的实践与应用
【10月更文挑战第9天】探索容器化技术:Docker的实践与应用
49 3