打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Castle的IoC容器深入分析 - linkin park - 博客园
userphoto

2008.06.17

关注
大家都知道,Castle的Windsor容器非常强大,可以横向扩展的先进架构和自持自动连接等高级功能,并且充分利用了.Net的优势和特点,非常值得学习研究。
在Castle中添加和使用组件非常简单:
1
IWindsorContainer container = new WindsorContainer( new XmlInterpreter("../BasicUsage.xml") );
2

3
container.AddComponent( 
"newsletter"
4
    
typeof(INewsletterService), typeof(SimpleNewsletterService) );
5
container.AddComponent( 
"smtpemailsender"
6
    
typeof(IEmailSender), typeof(SmtpEmailSender) );
7
container.AddComponent( 
"templateengine"
8
    
typeof(ITemplateEngine), typeof(NVelocityTemplateEngine) );
9
这样就可以了,不需要像Spring.Net那样写连接配置文件,因为在Castle中组件之间的依赖关系是自动检测并连接的。
那么,Castle是如何做到的呢?
当AddComponent的时候,Windsor其实是调用了MicroKernel来进行注册,Windsor只是MicroKernel的一个包装,容器的主要功能其实都是MicroKernel完成的,而MicroKernel被设计成一个非常精巧,但是可扩展能力超强的一个内核结构。
在MicroKernel中,添加一个组件的具体的代码如下:
public virtual void AddComponent(String key, Type serviceType, Type classType)
{
    
if (key == nullthrow new ArgumentNullException("key");
    
if (serviceType == nullthrow new ArgumentNullException("serviceType");
    
if (classType == nullthrow new ArgumentNullException("classType");

    ComponentModel model 
= ComponentModelBuilder.BuildModel(key, serviceType, classType, null);
    RaiseComponentModelCreated(model);
    IHandler handler 
= HandlerFactory.Create(model);
    RegisterHandler(key, handler);
}

首先,ComponentModelBuilder给组件生成了一个ComponentModel,这个Model实际上是用大量的反射来捕获这个组件的各种详细的元信息,就好象先给你来一次X光扫描,这个组件是什么东西清清楚楚。
建立模型的具体过程如下:

public ComponentModel BuildModel(String key, Type service, Type classType, IDictionary extendedProperties)
{
    ComponentModel model 
= new ComponentModel(key, service, classType);
    
    
if (extendedProperties != null)
    {
        model.ExtendedProperties 
= extendedProperties;
    }

    
foreach(IContributeComponentModelConstruction contributor in contributors)
    {
        contributor.ProcessModel( kernel, model );
    }
    
    
return model;
}

其实具体过程就是调用contributor来进行具体的信息收集,每个Contributor负责收集不同的信息,在DefaultMicroKernel中一共注册了以下7个Contributor来收集信息:

protected virtual void InitializeContributors()
{
    AddContributor( 
new ConfigurationModelInspector() );
    AddContributor( 
new LifestyleModelInspector() );
    AddContributor( 
new ConstructorDependenciesModelInspector() );
    AddContributor( 
new PropertiesDependenciesModelInspector() );
    AddContributor( 
new LifecycleModelInspector() );
    AddContributor( 
new ConfigurationParametersInspector() );
    AddContributor( 
new InterceptorInspector() );
}

他们各有各的功能,你可以可以自己写Contributor来收集你想要收集的信息。
接下来就是发出ComponentCreated的事件,这个事件是一个容器的扩展点,可以被注册的Facility接收到。
再接下来,就是调用HandlerFactory来创建一个IHandler,IHandler的主要功能就是创建组件的激活器(Activator),每个组件都对应一个Activator,Activator根据Lifestyle管理器来创建不同生命类型的组件实例,比如Singleton,PreThread,Transient等等。
然后在EnsureDependenciesCanBeSatisfied()这个方法中检查组件的依赖是否都得到了满足,这里就是自动连接的原理,假如没有满足,Castle就循环检查以前注册的每个组件是否满足该组件的要求,或者该组件是否满足以前注册的组件的要求,假如满足就添加到组件的依赖列表中。
最后,注册IHandler,激发Registed事件(另一个扩展点),完成整个组件的注册过程。

 

 

posted on 2005-08-02 15:44 linkin 阅读(4638) 评论(27)  编辑 收藏
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Castle IOC容器内幕故事(上)
Castle实践
Castle实践9-在Castle IOC容器中使用AspectSharp(全面剖析AspectSharp Facility) - 叶子的家 - 博客园
Unity API 解析(3)GameObject 类
Managed Extensibility Framework 概述
[Unity3D学习]Unity代码热更新解决方案测试结果总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服