截至目前,微软Enterprise Library已不断更新至4.1版本,但其精髓仍然是方便开发者快速开发自己的应用程序块。目前介绍Enterprise Library的文章大部分侧重于如何应用其中已有的应用程序块,如Data Access。而对如何创建自己的Enterprise Library则鲜有涉足。本系列笔者将侧重于介绍如何基于Enterprise Library的核心——Configuration和ObjectBuilder,构建属于企业自己的应用程序块以及期间可能出现的一些问题。此方面的高手请飘过。
第一阶段:HelloWorld
第一篇:创建第一个自己的Application Block
第二篇:Application Block生成原理详解
第三篇:自定义功能类的构造函数
第二阶段:实战模板引擎
第四篇: 创建模板引擎框架
第五篇: 创建模板引擎Library
第六篇:构建模板引擎处理逻辑
第七篇:实现模板引擎
第八篇:第二阶段回顾
本篇我们将继续企业库应用实践系列旅程。接上篇,我们将为类库的正常运行继续实现相关的辅助类。
一、为类库生成的辅助类新添一个目标Configuration,将相关的类放在这个文件夹中。
将上篇中的SoureceResolveFactory类文件移至这个文件夹下。
今天其余的类文件也将全部放在此文件夹中。
二、新添用于表达配置文件中配置的SourceResolveSettings类

SourceResolveSettings
1
public 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
1
public 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
1
public 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
1
public 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
1
public 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灵活、可扩展。敬请期待。