快捷搜索:

Castle IOC容器内幕故事(上)

主要内容

1.WindsorContainer阐发

2.MicroKernel阐发

3.注册组件流程

一.WindsorContainer阐发

WindsorContainer是Castle的IOC容器,也是它的一个核心,先来看一下WindsorContainer在Castle中所处的位置:

图1

WindsorContainer构建于MicroKernel之上,MicroKernel仅仅是供给了一个IOC的容器,异常的轻巧,它只依附于Castle.Model一个法度榜样集,但它的可扩展能力却很强,后面会讲到;可以这么理解,WindsorContainer为我们供给了一个Façade,它封装了MicroKernel,并且供给了一些扩展点,但它的核心仍旧是Microkernel。如下图所示:

图2

二.MicroKernel阐发

既然MicroKernel是WindsorContainer的核心,那我们就来看一下MicroKernel的布局,从下面的布局图中,可以看到MicroKernel的组成主要有SubSystem,Components,Facilities几个部分,SubSystem主要用来处置惩罚一些扩展功能,如设置设置设备摆设摆设、类型转换等,我们也可以实现自己的SubSystem;Components称为组件,在快速入门指南中我已经提到了,这里再说一下,办事是一个个的接口,接口约定了办事,从而使随意调换办事的实现对应用接口办事的代码没有任何的影响,组件是一个可重用的法度榜样单元,它实现了某个接口,并仅仅只实现了这一个优越的接口,也便是说,组件是实现了某个办事接口的类;Facilities我们称之为扩大单元,假如我们想扩大容器的功能,可以经由过程创建扩大单元来实现,我们可以在扩大单元里面订阅容器事故,给组件附加属性,建立拦截器,节制组件生命周期等,扩大单元因此一种插件的形式存在的,以是异常便于扩展,可以编写自己的扩大单元,后面我会写Castle自带的一些扩大单元的应用。MicroKernel的布局如下图:

图3

三.注册组件流程

现在我们来看一下当注册一个组件时,容器做了什么?

public virtual void AddComponent(String key, Type classType)

{

_kernel.AddComponent(key, classType);

}

public virtual void AddComponent(String key, Type serviceType, Type classType)

{

_kernel.AddComponent(key, serviceType, classType);

}

// http://terrylee.cnblogs.com

可以看到,WindsorContainer仅仅是调用了MicroKernel的措施来完成组件的注册,它只是对MicroKernel做了一次封装,核心的功能都由MicroKernel来完成,看一下MicroKernel中的AddComponent()措施的实现

public virtual void AddComponent(String key, Type classType)

{

if (key == null) throw new ArgumentNullException("key");

if (classType == null) throw new ArgumentNullException("classType");

ComponentModel model = ComponentModelBuilder.BuildModel(key, classType, classType, null);

RaiseComponentModelCreated(model);

IHandler handler = HandlerFactory.Create(model);

RegisterHandler(key, handler);

}

public virtual void AddComponent(String key, Type serviceType, Type classType)

{

if (key == null) throw new ArgumentNullException("key");

if (serviceType == null) throw new ArgumentNullException("serviceType");

if (classType == null) throw new ArgumentNullException("classType");

ComponentModel model = ComponentModelBuilder.BuildModel(key, serviceType, classType, null);

RaiseComponentModelCreated(model);

IHandler handler = HandlerFactory.Create(model);

RegisterHandler(key, handler);

}

// http://terrylee.cnblogs.com

您可能还会对下面的文章感兴趣: