Castle IOC容器实践之EnterpriseLibrary Configuration Facility

摘要:EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。

 

主要内容:

1.概述

2.使用Facility

3.原理浅析

 

一.概述

EnterpriseLibrary Configuration Facility就好像是在容器和数据类之间的桥,让我们可以轻松得去读取和操作配置文件。熟悉Enterprise Library的人都知道,在Enterprise Library中有一个Configuration Application Block,它可以使我们方便的从各种存储中读写配置信息,通过EnterpriseLibrary Configuration Facility我们就可以像使用普通的组件那样去注册一个数据类,它会用configurationkey来映射到Enterprise Library的配置文件中。先来看一下该Facility的相关信息:

Facility Information

Uses Proxy

No

Requires Configuration

Yes

Uses Attributes

No

Version

Beta 2

二.使用Facility

1.配置文件,这里使用配置文件注册组件的方式,放在应用程序配置文件中,这里唯一需要注意的是configurationkey,这个特性不能写错:

None.gif <? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< configSections >
None.gif
None.gif        
< section  name ="enterpriselibrary.configurationSettings"  type ="System.Configuration.IgnoreSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"   />
None.gif
None.gif        
< section  name ="castle"  type ="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"   />
None.gif
None.gif    
</ configSections >
None.gif
None.gif    
< enterpriselibrary .configurationSettings xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
None.gif
None.gif        defaultSection
=""  applicationName ="Application"  xmlns ="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/configuration" >
None.gif
None.gif        
< configurationSections >
None.gif
None.gif            
< configurationSection  name ="EditorSettings"  encrypt ="false" >
None.gif
None.gif                
< storageProvider  xsi:type ="XmlFileStorageProviderData"  name ="XML File Storage Provider"  path ="../../EditorSettings.config"   />
None.gif
None.gif                
< dataTransformer  xsi:type ="XmlSerializerTransformerData"  name ="Xml Serializer Transformer" >
None.gif
None.gif                    
< includeTypes  />
None.gif
None.gif                
</ dataTransformer >
None.gif
None.gif            
</ configurationSection >
None.gif
None.gif        
</ configurationSections >
None.gif
None.gif        
< keyAlgorithmStorageProvider  xsi:nil ="true"   />
None.gif
None.gif    
</ enterpriselibrary.configurationSettings >
None.gif
None.gif    
< castle >
None.gif
None.gif        
< facilities >
None.gif
None.gif            
< facility  id ="configuration"  type ="Castle.Facilities.EnterpriseLibrary.Configuration.EnterpriseConfigurationFacility, Castle.Facilities.EnterpriseLibrary.Configuration"   />
None.gif
None.gif        
</ facilities >
None.gif
None.gif        
< components >
None.gif
None.gif            
< component  id ="editorfontdata"  type ="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests"
None.gif
None.gif                configurationkey
="EditorSettings"   />
None.gif
None.gif            
< component  id ="editorservice"  type ="Castle.Facilities.EnterpriseLibrary.Configuration.Tests.EditorService, Castle.Facilities.EnterpriseLibrary.Configuration.Tests"   />
None.gif
None.gif        
</ components >
None.gif
None.gif    
</ castle >
None.gif
None.gif
</ configuration >

2.编写数据类文件:

None.gif public   class  EditorFontData
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {       
InBlock.gif    
private string  name;
InBlock.gif
InBlock.gif    
private float   size;
InBlock.gif
InBlock.gif    
private int     style;
InBlock.gif
InBlock.gif    
public EditorFontData()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{          
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public string Name 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gifreturn name; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{ name = value; }
ExpandedSubBlockEnd.gif    }
 
InBlock.gif
InBlock.gif    
public float Size 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gifreturn size; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{ size = value; }
ExpandedSubBlockEnd.gif    }
 
InBlock.gif
InBlock.gif    
public int Style 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gifreturn style; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{ style = value; }
ExpandedSubBlockEnd.gif    }
 
InBlock.gif
InBlock.gif    
public override string ToString() 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        StringBuilder sb 
= new StringBuilder();
InBlock.gif
InBlock.gif        sb.AppendFormat(
"Name = {0}; Size = {1}; Style = {2}", name, size.ToString(), style.ToString());
InBlock.gif
InBlock.gif        
return sb.ToString();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

3.采用XML方式的存储

None.gif <? xml version="1.0" encoding="utf-8" ?>
None.gif
None.gif
< EditorSettings >
None.gif
None.gif  
< xmlSerializerSection  type ="ConfigurationQuickStart.EditorFontData, Castle.Facilities.EnterpriseLibrary.Configuration.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
None.gif
None.gif    
< EditorFontData  xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" >
None.gif
None.gif      
< Name > Microsoft Sans Serif </ Name >
None.gif
None.gif      
< Size > 9.25 </ Size >
None.gif
None.gif      
< Style > 0 </ Style >
None.gif
None.gif    
</ EditorFontData >
None.gif
None.gif  
</ xmlSerializerSection >
None.gif
None.gif
</ EditorSettings >

4.使用数据类的组件

None.gif public   class  EditorService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private readonly EditorFontData data;
InBlock.gif
InBlock.gif    
public EditorService(EditorFontData data)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.data = data;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public EditorFontData Data
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn data; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

5.在容器中使用数据类

None.gif [TestFixture]
None.gif
public   class  FacilityTestCase
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    [Test]
InBlock.gif    
public void LoadingConfig()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        IWindsorContainer container 
= new WindsorContainer( new XmlInterpreter(new AppDomainConfigSource()) );
InBlock.gif
InBlock.gif        EditorService service 
= (EditorService) container[ typeof(EditorService) ];
InBlock.gif
InBlock.gif        Assert.AreEqual(
"Microsoft Sans Serif", service.Data.Name);
InBlock.gif
InBlock.gif        Assert.AreEqual(
9.25,service.Data.Size);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

可以看到,使用EnterpriseLibrary Configuration Facility非常的简单。最后还要注意一点,使用这个Facility需要安装Enterprise Library,因为它依赖于:

None.gif Microsoft.Practices.EnterpriseLibrary.Common.dll
None.gif
None.gifMicrosoft.Practices.EnterpriseLibrary.Configuration.dll

三.原理分析

下面对这个Facility的原理做一下简单的分析。在初始化的时候,它注册了一个名为EntLibConfigurationInspector的分发器

None.gif public   class  EnterpriseConfigurationFacility : AbstractFacility
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
protected override void Init()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gifKernel.ComponentModelBuilder.AddContributor( 
new EntLibConfigurationInspector() );
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
internal   class  EntLibConfigurationInspector : IContributeComponentModelConstruction
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public void ProcessModel(IKernel kernel, ComponentModel model)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (model.Configuration == nullreturn;
InBlock.gif
InBlock.gif        String configKey 
= model.Configuration.Attributes["configurationkey"];
InBlock.gif
InBlock.gif        
if (configKey == nullreturn;
InBlock.gif
InBlock.gif        model.ExtendedProperties[
"configurationkey"= configKey;
InBlock.gif
InBlock.gif        model.CustomComponentActivator 
= typeof(EntLibComponentActivator);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

EntLibConfigurationInspector中为ComponentModel注册一个CustomComponentActivator类型的Activator,这个CustomComponentActivator的实现为EntLibComponentActivator

None.gif internal   class  EntLibComponentActivator : AbstractComponentActivator
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public EntLibComponentActivator(ComponentModel model, IKernel kernel, 
InBlock.gif
InBlock.gif        ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction) : 
base(model, kernel, onCreation, onDestruction)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
protected override object InternalCreate()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        String configKey 
= (String) Model.ExtendedProperties["configurationkey"];
InBlock.gif
InBlock.gif        
return ConfigurationManager.GetConfiguration(configKey);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
protected override void InternalDestroy(object instance)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        String configKey 
= (String) Model.ExtendedProperties["configurationkey"];
InBlock.gif
InBlock.gif        ConfigurationManager.WriteConfiguration(configKey, instance);
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}


好了,关于EnterpriseLibrary Configuration Facility就简单的介绍到这里。

更多Castle文章可以访问:《Castle 开发系列文章

 

参考资料

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值