2012-04-09 168 views
1

我已經編寫了這段代碼來驗證我的業務規則,我想知道這是否是驗證業務對象的最佳解決方案。這樣我可以學習如何爲我的所有項目進行驗證。該解決方案可能存在許多有關軟件設計最佳實踐的嚴重問題。是這種方法驗證業務對象的最佳方法

public interface IRule 
{ 
    bool Isvalid(); 
} 
public class CategoryRule : IRule 
{ 
    CategoryRepository _category; 
    string _id, _name, _parent; 

    public CategoryRule(string id, string name, string parent) 
    { 
     _id = id; 
     _name = name; 
     _parent = parent; 
    } 
    public object IsValid() 
    { 
     bool result = this.ValidateId(); 
     if (result) 
      result = this.ValidateName(); 
     else 
     { 
      this.Message = "the id value is not correct."; 
      return false; 
     } 
     if (result) 
      result = this.ValidateParent(); 
     else 
     { 
      this.Message = "the name value is not correct."; 
      return false; 
     } 
     if (result) 
      return _category; 
     else 
     { 
      this.Message = "the parent value is not correct."; 
      return false; 
     } 

    } 
    private bool ValidateId() 
    { 
     long id; 
     if (long.TryParse(_id, out id)) 
      return true; 
     _category.Id = id; 
     return false; 
    } 
    private bool ValidateName() 
    { 
     if (!string.IsNullOrWhiteSpace(_name)) 
      return true; 
     _category.Name = _name; 
     return false; 
    } 
    private bool ValidateParent() 
    { 
     long parent; 
     if (long.TryParse(_parent, out parent)) 
      return true; 
     _category.Parent = parent; 
     return false; 
    } 
    public string Message 
    { 
     get; 
     private set; 
    } 
} 
public class CategoryPresenter 
{ 
    View _view; 
    CategoryRepository _model; 

    public void AddCategory() 
    { 
     CategoryRule rule = new CategoryRule(_view.Id, _view.Name, _view.Parent); 
     object obj = rule.IsValid(); 
     if (obj.GetType() == typeof(bool)) 
      _view.ShowError(rule.Message); 
     _model.Add(obj as CategoryRepository); 
    } 
} 

我很感激任何關於如何寫這段代碼的建議。

回答

2

看看IValidatableObject接口。它與您的IRule接口完全相同,只是它允許同時返回多個錯誤消息。

數據註釋包中還內置了驗證規則。例如,在編寫MVC模型時,使用[Required]屬性標記字段足以使其自動被要求爲非空值。手動執行驗證,使用Validator輔助類。

+0

我沒有使用mvc。我用mvp標記了這個問題,但是感謝這些信息。 – jim 2012-04-09 20:02:29

+0

除IRule接口外的其他任何問題? – jim 2012-04-13 08:22:36