上一篇文章介紹了C# 3.0中的分部方法(http://www.cnblogs.com/AndersLiu/archive/2007/07/30/836870.html),並給出了幾種應用情境。本文繼續介紹一種實用的情境——對實體類的欄位進行驗證。
如果是自己手寫實體類,通常會在資料欄位所對應的屬性的set訪問器中增加對值進行驗證的代碼,這樣可以避免不符合資料庫要求的資料進入資料庫(儘管資料庫也會進行驗證,但等待資料庫拋出異常未免有點過分)。
而對於Linq自動產生的實體類來說,是不會產生這些代碼代碼的。而如果我們手動修改Linq to SQL自動產生的程式碼,我們會鬱悶地發現——當在xxx.dbml設計器中對實體類進行了編輯之後,所有這些代碼會重新自動產生一次——我們的修改將被覆蓋!(這是相當鬱悶的一件事,我曾費盡艱辛給自動產生的所有public類型及其public成員添加了xml文檔注釋,可就因為在dbml設計器中做了一個小小的改動,結果,所有注釋都沒有了……)
此時,分部方法就派上用場了。VS2008還是比較仗義的,為了方便使用者擴充,它產生的所有實體類都是partial的,同時,根據前一篇文章中的“情境1”,它還聲稱了一系列partial方法。比如:
[Column(Storage="_AccessKey", DbType="NVarChar(32) NOT NULL", CanBeNull=false)]
public string AccessKey
{
get
{
return this._AccessKey;
}
set
{
if ((this._AccessKey != value))
{
this.OnAccessKeyChanging(value); // 注意,此處調用的是partial方法,實現了一個“輕量級事件”
this.SendPropertyChanging();
this._AccessKey = value;
this.SendPropertyChanged("AccessKey");
this.OnAccessKeyChanged(); // 注意,此處調用的是partial方法,實現了一個“輕量級事件”
}
}
}
對應的partial方法如下:
partial void OnAccessKeyChanging(string value);
partial void OnAccessKeyChanged();
看到這裡,我想熟悉.NET控制項(不論是WinForm控制項還是WebForm控制項)的朋友,一定對這個Changing和Changed很眼熟。
好了,我感覺自己廢話越來越多了。P大個事說半天。
簡言之,只要添加一個原始碼檔案,並擴充這個partial類,在其中實現partial方法即可完成對欄位的驗證。如:
public const int AccessKeyMaxLength = 32;
partial void OnAccessKeyChanging(string value)
{
if(value.Length >= AccessKeyMaxLength)
throw new Exception();
}
注意這裡“處理了OnAccessKeyChanging事件”,因為要在屬性值設定之前進行驗證。
其實Anders Liu要說的就這麼點,over。