[C#] 使用Enterprise Library Validation Block對表單進行驗證 (4) - 將驗證方法封裝在Model之中
前言
在前面的文章中,講解了如何利用Validation Application Block,
來對Model進行驗證,並回傳自訂錯誤訊息,
在這篇文章中,將介紹如何將驗證方法也封裝到Model之中,
實現與邏輯層的解耦,也讓驗證在使用上更為簡單方便。
實際演練
首先,我們替所有的Model建立一個介面,
當作實現驗證方法的開口,
它提供了一個驗證的方法,以及一個屬性來取得驗證錯誤的原因
public interface IValidatable
{
string FaultReason { get; }
bool IsValid();
}
接下來我們為這個Interface實現具體的驗證方法邏輯,
也為所有欲驗證的Model建立一個Base Class
public class ValidatableModel<T> : IValidatable where T : class
{
public string FaultReason { get; private set; }
public virtual bool IsValid()
{
//Validate Model
var validateResults = Validation.Validate<T>(this as T);
//When validation is not valid
if (!validateResults.IsValid)
{
//Collect error information and append to FaultReason.
foreach (var result in validateResults)
{
this.FaultReason += string.Format(@"{0}:{1}" + Environment.NewLine, result.Key, result.Message);
}
return false;
}
return true;
}
}
之後,我們之後只需要讓已經建立好驗證規則的Model繼承這個Class,
就可以直接呼叫Model.IsValid來進行驗證的動作,並從FaultReason取得錯誤訊息。
public class Person : ValidatableModel<Person>
Person person = new Person();
if (!person.IsValid())
{
MessageBox.Show(person.FaultReason);
}
else
{
MessageBox.Show("Validation Pass");
}
如果日後我們要抽換Validation Block的驗證方法,
也只要修改我們的Base Class就可以囉!
或是我們也可以透過IValidatable,來封裝一些特殊的驗證邏輯喔!
比如說一次驗證Model,並收集整組錯誤訊息
public class ModelValidator
{
private List<ValidationErrorMessage> mErrorMessageList = new List<ValidationErrorMessage>();
public List<ValidationErrorMessage> MErrorMessageList
{
get
{
return mErrorMessageList;
}
}
// Public Methods (1)
public bool ValidateModels(List<IValidatable> modelList)
{
int counter = 1;
foreach (var model in modelList)
{
bool isValid = model.Validate();
if (!isValid)
{
mErrorMessageList.Add(new ValidationErrorMessage() { Index= counter, ErrorMessage = model.FaultReason });
}
counter++;
}
return mErrorMessageList.Count == 0;
}
}
結語
透過一些簡單的方法,
可以讓我們的程式不但在使用上更為方便,還可以讓程式更為好讀,
同時也降低了程式的耦合性,
在日後要依據不同情境作抽換的時候也更為簡單囉!
如果有任何意見,歡迎大家多多提供指教喔! ^_^