[C#] 使用Enterprise Library Validation Block對表單進行驗證 (4) - 將驗證方法封裝在Model之中

  • 4954
  • 0

[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;
    }
}

 

結語

透過一些簡單的方法,

可以讓我們的程式不但在使用上更為方便,還可以讓程式更為好讀,

同時也降低了程式的耦合性,

在日後要依據不同情境作抽換的時候也更為簡單囉!

如果有任何意見,歡迎大家多多提供指教喔!  ^_^