2009-06-24 42 views
1

對於這個例子,我有兩個類是針對LINQ-to-SQL模型類的部分類。是否有另一種方法爲LINQ-to-SQL模型類創建合同?

public partial class Foo 
{ 
    public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     yield break; 
    } 

    partial void OnValidate(ChangeAction action) 
    { 
     if (!IsValid) 
      throw new ApplicationException("Rule violations prevent saving"); 
    } 
} 

public partial class Bar 
{ 
    public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     yield break; 
    } 

    partial void OnValidate(ChangeAction action) 
    { 
     if (!IsValid) 
      throw new ApplicationException("Rule violations prevent saving"); 
    } 
} 

我想考慮此因素的功能以去除冗餘邏輯。我試着用IModel接口,然後擴展方法的合同,但它與分部類失效。

我結束了與此:

public class ModelBase 
    { 
     public bool IsValid 
     { 
      get 
      { 
       return this.GetRuleViolations().Count() == 0; 
      } 
     } 

     public void OnValidate(ChangeAction action) 
     { 
      if (!IsValid) throw new ApplicationException("Rule violations prevent saving"); 
     } 

     public virtual IEnumerable<RuleViolation> GetRuleViolations() { return null; } 
    } 

public partial class Blog : ModelBase 
{ 
    partial void OnValidate(ChangeAction action) 
    { 
     base.OnValidate(action); 
    } 

    public override IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     // rules omitted 
    } 
} 

我應該這樣做另一種方式?謝謝。

回答

1

,我會添加到這個唯一的事情是,你可能希望定義一個接口,然後實現接口的各種基類,提供一些默認的驗證。例如,您可能有一個基類,它執行字符串屬性的XSS驗證,驗證它們不包含任何HTML。使用一個接口將允許你從這些基類中的任何一個(或者甚至只是接口,如果你想要的話)派生出來,並且仍然能夠把它們當作接口。您也可以考慮使用允許指定ChangeAction的簽名 - 您可能對刪除的更新或插入的驗證規則不同。

public interface IValidatedEntity 
{ 
    IEnumerable<RuleViolations> GetRuleViolations(); 
    IEnumerable<RuleViolations> GetRuleViolations(ChangeAction action); 
} 

public abstract class XSSValidatedEntity : IValidatedEntity 
{ 
    public virtual IEnumerable<RuleViolations> GetRuleViolations() 
    { 
     return GetRuleViolations(ChangeAction.Insert); 
    } 

    public virtual IEnumerable<RuleViolations> GetRuleViolations(ChangeAction action) 
    { 
     if (action != ChangeAction.Delete) 
     { 
      return ValidateStringProperties(); 
     } 
     return new List<RuleViolations>(); 
    } 
} 
+0

「您可能對刪除的更新或插入的驗證規則不同」,不錯 – blu 2009-06-24 02:00:26

相關問題