|
我不知道大家對CodeDOM的代碼生成機制是否熟悉,但是有一點可以確定:如果你使用過Visual Studio,你就應(yīng)該體驗過它帶給我們在編程上的便利。隨便列舉三種典型的代碼生成的場景:在創(chuàng)建強類型DataSet的時候,VS會自動根據(jù)Schema生成相應(yīng)的C#或者VB.NET代碼;當(dāng)我們編輯Resource文件的時候,相應(yīng)的的后臺代碼也會自動生成;當(dāng)我們通過添加Web Reference調(diào)用Web Service或者WCF Service的時候,VS會自動生成服務(wù)代理的代碼和相應(yīng)的配置。總的來說,通過和VS集成的動態(tài)代碼生成工具使我們可以“強類型”的方式進(jìn)行編程,進(jìn)而提供我們的效率并減低錯誤的幾率。
實際上,除了VS提供的這些典型的代碼生成場景中,我們可以根據(jù)需要開發(fā)一些自定義代碼生成器,并且通過VS的擴(kuò)展實現(xiàn)后臺代碼的實時生成,從而實現(xiàn)強類型編程的目的,現(xiàn)在我們舉一個典型的應(yīng)用場景——消息管理。
一、一個典型的自定義代碼生成器應(yīng)用場景——消息管理
無論對于怎么樣的應(yīng)用,我們都需要維護(hù)一系列的消息。消息的類型很多,比如驗證消息、確認(rèn)消息、日志消息等。我們一般會將消息儲存在一個文件或者數(shù)據(jù)庫中進(jìn)行維護(hù),并提供一些API來獲取相應(yīng)的消息項。這些API一般都是基于消息的ID來獲取的,換句話說,消息獲取的方式是以一種“弱類型”的編程方式實現(xiàn)的。如果我們能夠根據(jù)消息存儲的內(nèi)容動態(tài)地生成相應(yīng)的C#或者VB.NET代碼,那么我們就能夠以一種強類型的方式來獲取相應(yīng)的消息項了。
比如說,現(xiàn)在我們定義了如下一個MessageEntry類型來表示一個消息條目。為了簡單,我們盡量簡化MessageEntry的定義,僅僅保留三個屬性Id、Value和Category。Category表示該消息條目所屬的類型,你可以根據(jù)具體的需要對其分類(比如根據(jù)模塊名稱或者Severity等)。Value是一個消息真實的內(nèi)容,可以包含一些占位符({0},{1},…{N})。通過指定占位符對用的值,最中格式化后的文本通過Format返回。
1: public class MessageEntry
2: {
3: public string Id { get; private set; }
4: public string Value { get; private set; }
5: public string Category { get; private set; }
6: public MessageEntry(string id, string value, string category)
7: {
8: this.Id = id;
9: this.Value = value;
10: this.Category = category;
11: }
12: public string Format(params object[] args)
13: {
14: return string.Format(this.Value, args);
15: }
16: }
NET技術(shù):從數(shù)據(jù)到代碼—通過代碼生成機制實現(xiàn)強類型編程[上篇],轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。