截至目前,微软Enterprise Library已不断更新至4.1版本,但其精髓仍然是方便开发者快速开发自己的应用程序块。目前介绍Enterprise Library的文章大部分侧重于如何应用其中已有的应用程序块,如Data Access。而对如何创建自己的Enterprise Library则鲜有涉足。本系列笔者将侧重于介绍如何基于Enterprise Library的核心——Configuration和ObjectBuilder,构建属于企业自己的应用程序块以及期间可能出现的一些问题。此方面的高手请飘过。
第一阶段:HelloWorld
第一篇:创建第一个自己的Application Block
第二篇:Application Block生成原理详解
第三篇:自定义功能类的构造函数
第二阶段:实战模板引擎
第四篇: 创建模板引擎框架
第五篇: 创建模板引擎Library
第六篇:构建模板引擎处理逻辑
第七篇:实现模板引擎
第八篇:第二阶段回顾
本篇我们将继续企业库应用实践系列旅程。接上篇,我们将为类库的正常运行继续实现相关的辅助类。
一、为类库生成的辅助类新添一个目标Configuration,将相关的类放在这个文件夹中。
将上篇中的SoureceResolveFactory类文件移至这个文件夹下。
今天其余的类文件也将全部放在此文件夹中。
二、新添用于表达配置文件中配置的SourceResolveSettings类
SourceResolveSettings
1public class SourceResolveSettings : SerializableConfigurationSection
2 {
3 public const String SectionName = "sourceResolveConfiguration";
4
5 private const string resolversProperty = "resolvers";
6
7 private const string defaultResolverProperty = "defaultResolver";
8
9 public SourceResolveSettings()
10 {
11 }
12
13 [ConfigurationProperty( defaultResolverProperty, IsRequired = false )]
14 public String DefaultResolverName
15 {
16 get
17 {
18 return ( String ) this[ defaultResolverProperty ];
19 }
20 set
21 {
22 this[ defaultResolverProperty ] = value;
23 }
24 }
25
26 [ConfigurationProperty( resolversProperty, IsRequired = false )]
27 public NameTypeConfigurationElementCollection<SourceResolveData, SourceResolveData> Providers
28 {
29 get
30 {
31 return ( NameTypeConfigurationElementCollection<SourceResolveData, SourceResolveData> ) base[ resolversProperty ];
32 }
33 }
34
35 }
36
37
三、新添用于方便读取SourceResolveSettings数据的SourceResolveConfigurationView类
SourceResolveConfigurationView
1public class SourceResolveConfigurationView
2 {
3 IConfigurationSource configurationSource;
4
5 public SourceResolveConfigurationView( IConfigurationSource configurationSource )
6 {
7 if( configurationSource == null )
8 throw new ArgumentNullException( "配置源不能为空." );
9
10 this.configurationSource = configurationSource;
11 }
12
13 public SourceResolveSettings GetSettings()
14 {
15 return ( SourceResolveSettings ) configurationSource.GetSection( SourceResolveSettings.SectionName );
16 }
17
18 public String DefaultResolverName
19 {
20 get
21 {
22 return GetSettings().DefaultResolverName;
23 }
24 }
25
26 public SourceResolveData GetProviderData(String providerName)
27 {
28 SourceResolveData data = GetSettings().Providers.Get( providerName );
29
30 if( data == null )
31 {
32 throw new ConfigurationErrorsException(
33 String.Format( "Provider Not Found : {0} ", providerName ) );
34 }
35
36 return data;
37 }
38 }
39
40
四、创建用于表达功能实现类数据的SourceResolveData类
SourceResolveData
1[Assembler(typeof(SoureceResolveAssember))]
2 public class SourceResolveData : NameTypeConfigurationElement
3 {
4 public SourceResolveData()
5 {
6 }
7
8 public SourceResolveData( String name, Type type ) : base( name, type )
9 {
10 }
11 }
12
13
五、创建对象装配类(主要功能是自定义构造函数,本项目采用不带任何参数的构造函数)
SoureceResolveAssember
1public class SoureceResolveAssember : IAssembler<ISourceResolver,SourceResolveData>
2 {
3 public ISourceResolver Assemble( IBuilderContext context, SourceResolveData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache )
4 {
5 return ( ISourceResolver ) Activator.CreateInstance( objectConfiguration.Type );
6 }
7 }
六、创建自定义的类工厂
SoureceResolveCustomFactory
1public class SoureceResolveCustomFactory : AssemblerBasedCustomFactory<ISourceResolver,SourceResolveData>
2 {
3 protected override SourceResolveData GetConfiguration( string name, IConfigurationSource configurationSource )
4 {
5 return new SourceResolveConfigurationView( configurationSource ).GetProviderData( name );
6 }
7 }
8
9
七、创建用于文件映射的类SourceResolverDataRetriever
Code
1public class SourceResolverDataRetriever : IConfigurationNameMapper
2 {
3 public string MapName( string name, IConfigurationSource configSource )
4 {
5 if( !String.IsNullOrEmpty( name ) )
6 return name;
7
8 return new SourceResolveConfigurationView( configSource ).DefaultResolverName;
9 }
10 }
11
12
八、至此所有的类设计完成,我们再来为功能接口加上标记
ISourceResolver
1[ConfigurationNameMapper(typeof(SourceResolverDataRetriever))]
2 [CustomFactory(typeof(SoureceResolveCustomFactory))]
3 public interface ISourceResolver
4 {
5 SegmentCollection Translate(String html );
6 }
7
编译项目,通过。
至此,我们的类库已经成功构建。下一篇中,我们将开始分析功能接口ISourceResolver的实现。我们的实现机制将采用类似于ObjectBuilder(Enterprise Library的对象生产“流水线”)的方式,使得我们的TemplateEngineer灵活、可扩展。敬请期待。