深度剖析Byteart Retail案例:应用程序的配置
Byteart Retail提供了相对简单的配置方式:对于应用程序中所需要的参数,都是通过web.config文件进行配置的。这一点与框架系统的配置不同。框架系统至少应该提供两种配置方式:直接编写代码的方式,以及web/app.config的方式,这是为了迎合不同的使用场景而设计的。因为作为一套框架而言,它为应用程序的正确运行提供了支撑平台,因此,它需要向开发者提供直接编写代码的配置方式,以迎合测试的需要;同时,在生产环境中,用户还应该能够以配置文件的方式(.NET的标准做法是使用web/app.config文件)对框架进行配置,以便能够在不对应用程序进行二次编译的情况下,更改应用程序的执行行为。作为一个企业级应用程序的演示案例,Byteart Retail并没有在配置部分进行过多的设计,它仅仅是展示了一个普通的.NET应用程序的配置实现方式。
回顾.NET应用程序配置的标准做法
在.NET应用程序中,标准的配置方式都是使用web/app.config文件,具体是web.config还是app.config,就看主程序的类型是Web应用程序,还是普通的Windows应用程序。如果仅需为应用程序提供一些键值对的配置信息,那么可以直接在web/app.config中<appSettings>节点下通过add标记添加这些键值对即可。使用的时候也非常方便,比如:
var value = System.Configuration.ConfigurationManager.AppSettings["key"];
记得在使用之前添加对System.Configuration程序集的引用。
另外一种比较复杂的实现方式就是自定义配置节(Configuration Section),这时候你需要从System.Configuration.ConfigurationSection继承一个类型(比如:ByteartRetailConfigSection),在这个类型中使用ConfigurationPropertyAttribute,对一些属性进行标记,表示这些属性对应于配置节中的某个节点。当然,这些属性类型可以是简单的数据类型,可以是ConfigurationElement的子类,还可以是ConfigurationElementCollection的子类。最后,在web/app.config中的<configSections>节点下声明这个新建的配置节,即可对其进行配置。在使用的时候,用System.Configuration.ConfigurationManager.GetSection即可将配置信息读入。
以上是两种最为常见的方式,当然还有一些相对复杂的配置节的声明与定义的方法,在此也就不多讨论了,MSDN上有非常详细的文档可以参考。接下来,让我们一起看看,在Byteart Retail中是如何定义配置信息的。
Byteart Retail中配置部分的实现
Byteart Retail的配置部分对以下信息进行了定义:1、角色的权限键值(这将在另一个部分进行介绍);2、主页上数据表的展示参数(主要是分页参数);3、电子邮件配置。下图大致表示了Byteart Retail所定义的配置信息结构:
接下来,我们就可以根据这个配置信息的结构设计来开发我们的配置部分。
使用Configuration Section Designer插件开发案例的配置部分
我觉得,偷懒并不是一件坏事,在日常工作中巧妙灵活地使用工具,不仅能够减小重复劳动的工作量,而且还能减少出错的机会,事半功倍。考察.NET下应用程序配置部分的实现,我们不难得知:其实整个开发中都是实现一些Configuration Element和Configuration Element Collection,然后通过Configuration Section来组织整个配置信息的结构。在这个过程中,我们需要手工定义很多继承于ConfigurationElement和ConfigurationElementCollection的类,并在这些类中添加很多属性、实现很多方法。Byteart Retail的配置信息结构还算相对简单,也只包含了三个Configuration Element和一个Configuration Element Collection。如果某些框架或应用需要大量的配置信息输入,那么单是开发这样一套配置组件,就需要投入大量人力。
手工编写代码的另一个问题是,由于我们的配置信息更偏向于一种树状的组织形式,因此,一旦配置结构变得复杂,无论是在开发阶段,还是到后期代码的维护阶段,都会让人眼花缭乱。为了了解某个应用程序的配置信息是如何组织的,程序员或许需要从Configuration Section的实现上入手,逐步理清各部分的关联关系,这无疑给代码阅读造成了不小的负担。
因此,我在Byteart Retail案例中,选用了一套名为Configuration Section Designer(http://csd.codeplex.com)的Visual Studio扩展插件,它不仅免费,而且支持Visual Studio 2005/2008/2010/2012等多个版本,在很早以前,我就已经在《介绍一款好用的基于.NET的配置文件设计工具》一文中对其进行了详细介绍,通过了解您会发现,它带给您的不仅仅是一点点惊喜。
在ByteartRetail.Infrastructure.Config目录下,有一个ByteartRetailConfigSection.csd文件,结构如下:
这就是Configuration Section Designer的设计文件,其余的都是后台关联文件,包括以下四种文件:
- ByteartRetailConfigSection.csd.config:这是一个用于测试的配置文件,你可以在设计完你的配置信息结构之后,直接打开这个文件输入一些内容进行测试。当然,基本上用处不大
- ByteartRetailConfigSection.csd.cs:自动化产生的C#代码文件,它就根据你的设计,包含了对ConfigurationSection、ConfigurationElement以及ConfigurationElementCollection的定义
- ByteartRetailConfigSection.csd.diagram:设计器图形文件,定义了被设计器所使用的一些元数据,基本上不用管它,直接双击打开.csd文件即可
- ByteartRetailConfigSection.csd.xsd:产生的XSD文件。你可以在配置文件中应用这个xsd文件,于是,当你对配置节进行编辑的时候,Visual Studio会自动启用IntelliSense帮助你简化编辑工作
双击ByteartRetailConfigSection.csd文件,我们可以看到以下设计界面:
这个设计的结构是不是跟上面我们所讨论的配置信息的结构是一样的呢?
注意一点,如果您的Visual Studio没有安装Configuration Section Designer,那么您仍然可以编译整个Byteart Retail解决方案,所不同的是,您将无法打开这样的设计器。
其实这就是另一种“领域特定语言(DSL)”的应用(有一种在我前面的博客中已经介绍过了,那就是Fluent Interface):这个csd文件包含了对这样一种语言的定义:这种语言用来描述一个.NET应用程序的配置信息。开发者只需要知道.NET下实现应用程序配置的几个基本概念,即可使用这种领域特定语言来定义一个配置信息结构,剩下的工作,就是通过模板转换,将这种语言翻译成C#代码。
在应用程序中使用配置信息
为了简化配置信息的读取,我在Byteart Retail中实现了一个单件类型:ByteartRetail.Infrastructure.Config.ByteartRetailConfigurationReader。这个单件类型的实现也非常简单,就是应用程序需要读取什么样的配置数据,这个类型就返回什么样的属性值。使用单件的一个好处是,无需重复读取配置文件,当然也可以使用静态字段来实现。
总结
本文介绍了Byteart Retail中配置部分的实现,同时也介绍了一款用于配置信息结构设计的DSL工具的使用,旨在让读者朋友能够了解到DSL的优势及其在软件开发领域的重要性。希望通过本文的介绍,能够开阔大家的视野,并能帮助大家在实际工作中提高开发效率。
附记
《深度剖析Byteart Retail》系列文章还剩下应用层部分没有介绍,我想在此向大家了解一下,看大家对这个案例的哪些部分仍然感兴趣,请大家在此留言告知。不过尽量以Byteart Retail这个案例为主,对于一些架构设计技术上的问题,我会直接回复大家的留言。
另外,我正在整理这个系列文章的PDF文件,等全系列完成之后我会同步发布这个PDF文件供大家下载。对于希望能在公交地铁上打发时间的朋友来说,我想您应该会喜欢这个PDF文件。