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文件。