Verinin kendi kendini test etme yaklaşımı Validation Application Block ile iyice güçlendi. Artık Entity’ler daha zeki ve sakladıkları verinin doğruluğundan Entity nesnesi sorumlu. Validation Application Block veriyi Entity üzerinde saklayan programlar için mükemmel bir yaklaşım sunuyor. Fakat Typed DataRow üzerinde bir Application Block yok. Peki benim gibi üşengeç bir .Net yazılımcısı iseniz Entity nesneleri ile ilişkisel verileri saklamak zor geliyorsa, tüm verileri Typed DataSet içinde taşımak ve işlemek size daha kolay geliyorsa ne yapmalısınız?
Seçenek kalmadı kullandığınız Typed DataSet’leri kendi kendini test edebilir şekle getirmeliyiz. Ne gerekli bize:
Atomik test işlemlerini yapan Attribute sınıflar.
Bu test işlemlerini işletecek Controller sınıfı
Tabi tüm bu sınıfların veriden bağımsız olması yani Generic olması gerekmektedir. Burada ki kısıtlama Validation Application Block her bir Entity Field’a attribute vererek doğrulama yapılmakta fakat Typed DataRow üzerinden ki Field’lara Attribute kalıcı olarak eklenemez. Onun için bizim CheckAtiibute’lerimiz direk Typed DataRow nesnelerine eklenmelidir.
Doğrulama iki şekilde olur:
Check: Veri kendi başına doğru mu sorusudur. Mesela email alanı gecerli mi? Para alanına negatif değer girildi mi?
Validation: Veri iş kurallarına uygun mu sorusudur. Yani veri diğer veriler ile birlikte doğru mu?
Tüm işi gerçekleştiren Controller sınıfıdır. Check hatalarını girildiği anda (OnFly) yakalamak için DataSource almaktadır. DataSource üzerinden veri değiştiği zaman BaseCheck sınıfından türetilen Check kuralları çalıştırılmakta ve karşılaşılan hatalar ColumnError olarak atanmaktadır.
Önce takip edilecek Row’a Attributeler atanmalı:
[NotNullCheck("Column1",UserFriendlyName="Birinci alan")] [MinimumCheck("Column2",12, UserFriendlyMessage = "İkinci alandaki veri 12 den k‡k olamaz")] [UniqueCheck("Column3", UserFriendlyMessage = "İkinci alandaki veri tüm tabloda unique olmalı")] partial class DataTable1Row { }
[
{
}
Veri değişimi takibi:
#region
table.ColumnChanging +=
e.Row.SetColumnError(e.Column, CheckRow(e.Column, e.Row, e.ProposedValue));
#endregion
Değişen veriyi test et
dataRow.EndEdit();
result += attr.IsValid(dataRow, columnNewValue);
Check işleminin çalışma zamanı görüntüsü:
IsValid çağrısı ile önce Check kontrolleri çalıştırılır eğer tüm checkler doğru ise kontrol edilen Row HasSelfValidation attribute’ne sahip mi kontrolü yapılır. Eğer Row HasSelfValidation attribute’ne sahip ise SelfValidation attribute’ne sahip fonksiyonlar aranır ve bu fonksiyonlar çağırılır.
row.EndEdit(); _errorMessage =
row.EndEdit();
_errorMessage =
_errorMessage += CheckRow(col, row, row[col]);
//tüm childe row'ları valid mi
_errorMessage += CheckRow(col, childeRow, childeRow[col]);
// validation
Validation kontrollerinin çalışma zamanı görüntüsü:
Emre Coşkun
http://emrecoskun.blogspot.com/
23 / 3 / 2007