截至目前,微软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灵活、可扩展。敬请期待。