2009-06-24 10 views
1

この例では、LINQ-SQLモデルクラスに対する部分クラスである2つのクラスがあります。LINQ-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

「削除よりも削除または挿入よりも異なる検証ルールがある可能性があります。nice – blu

関連する問題