2011-10-05 10 views
1

私は、以下のポストシャープのアスペクトを使ってクラスのプロパティを検証します。PostSharpアスペクトコールはインスタンスごとに1回だけです

[ProtoContract] 
    public sealed class Web2Image : WebEntity 
    { 
     [ProtoMember(1009), Validator.Collection(Data = new[] { "jpg", "bmp", "png", "tiff" })] 
     public override string OutputFormat { get; set; } 
} 

プロパティOUTPUTFORMATは、第1の特性アクセスで検証されているが、検証が実行され、プロパティコードにアクセス第二及び第三時間。 Aspectの実行を、自分のプロパティのクラスインスタンスごとに1回だけ制限したいと思います。どうやってするか?

public class Validator 
    { 

     [Serializable] 
     [Collection(AttributeExclude = true)] 
     [MulticastAttributeUsage(MulticastTargets.Property)] 
     public class Collection : LocationInterceptionAspect 
     { 
      public string[] Data; 

      public override void OnGetValue(LocationInterceptionArgs args) 
      { 

       SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args); 
       /* SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args.Binding.ToString());*/ 

       args.ProceedGetValue(); 
       if (args.Value == null) 
       { 
        args.Value = Data[0]; 
        args.ProceedSetValue(); 
       } 

       foreach (var s in Data) 
       { 
        if (args.Value.ToString().ToLower() == s.ToLower()) 
         return; 

       } 

       throw new EngineException(string.Format("Value \"{0}\" is not correct. {1} parameter can accept only these values {2}", args.Value, args.LocationName, string.Join(",", Data))); 

      } 

     } 
} 

答えて

0

あなたはIInstanceScopedAspectを実装する必要があります。 IInstanceScopedAspectの実装方法など、ライフタイムとスコープの詳細については、http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspxhttp://www.sharpcrafters.com/blog/post/Day-10-Aspect-Lifetime-Scope-Part-2.aspxを参照してください。

これはインスタンスごとのインスタンスを取得します(今は1つのタイプにつき1回です)。

チェックを行う限り、スイッチを設定することができます(trueの場合は終了、それ以外の場合はチェック、nullの場合はその他の初期値)。

関連する問題