2017-03-13 4 views
0

キャッスルウィンザーでインターセプターを使用しているときに、関数が呼び出されると(IInvocationタイプの呼び出しパラメーター)呼び出されるターゲットにアクセスできます。城ウィンザーインターセプター - すでにターゲットにターゲットを取得

は、以下のように、私はコードを書くことができるように、このインターセプタのコンストラクタで、すでに迎撃の目標を取得することが可能です:

public class MyInterceptor: IInterceptor 
{ 
    public MyInterceptor(ITargetOfInterception target, ILogger logger) 
    { 
     logger.Log("Interceptor created for target type: " + target.GetType()); 
    } 
} 

答えて

1

それはコンストラクタでターゲットへのアクセスを取得することはできませんが、あなたは、あなたがIOnBehalfAwaresee doco here)を実装することにより、後にしているものを達成することができます

public void SetInterceptedComponentModel(ComponentModel target) 
{ 
    logger.Log("Interceptor created for target: " + target.ToString()); 
} 
+0

ありがとう、まさに私が探していたものです。この場所のInvocationTargetへの参照を取得することも可能ですか? (インターセプトメソッドのIInvocation.InvocationTargetと同じ?)。私はComponentModelで同等のプロパティを見つけることができません。 – user2959547

0

あなたはすでにあなたのインスタンスを持っている必要があります...

container.Register(Component.For<IInterceptor>().ImplementedBy<Logger>().Named("myinterceptor")); 

次に、それぞれのクラスをインターセプタで属性でデコレートします。あなたがインターセプタを実装する場合

[Interceptor("myinterceptor")] 
public class Logger : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) { 
     Console.WriteLine(">> type in <<"); 
     invocation.Proceed(); 
     Console.WriteLine(">> type out <<"); 
    }  
} 

あなたは、このような横断的関心事は、インターセプタによって対処されるように定義されているので、解決されたタイプを知ることができるようになります。

私は、インターセプタの指示にバインドされているすべてのタイプではなく、インターセプタとの契約が必要なすべてのタイプをインターセプタに知らせたいと思っています。私はこれが助けて欲しい!

EDITは:私はそれらを登録する方法

Public Class LoggingInterceptionBehavior 
     Implements IInterceptionBehavior 
     Public Function Invoke(input As IMethodInvocation, getNext As GetNextInterceptionBehaviorDelegate) As IMethodReturn Implements IInterceptionBehavior.Invoke 
      ' Before invoking the method on the original target. 
      Dim icp As ClaimsPrincipal = TryCast(Thread.CurrentPrincipal, ClaimsPrincipal) 

      ' Access IClaimsIdentity which contains claims 
      Dim claimsIdentity As ClaimsIdentity = DirectCast(icp.Identity, ClaimsIdentity) 
      Dim param = GetParam(input) 

      If claimsIdentity IsNot Nothing Then 
       If param IsNot Nothing Then 
        WriteLog([String].Format("{0} is invoking method {1} at {2} with a parameter of {3}", claimsIdentity.Name, input.MethodBase, DateTime.Now.ToLongTimeString(), param)) 
       Else 
        WriteLog([String].Format("{0} is invoking method {1} at {2} without a parameter", claimsIdentity.Name, input.MethodBase, DateTime.Now.ToLongTimeString())) 
       End If 

      Else 
       'no claim 
       WriteLog([String].Format("NO CLAIM Invoking method {0} at {1} with a parameter of {2}", input.MethodBase, DateTime.Now.ToLongTimeString(), param)) 
      End If 

      ' Invoke the next behavior in the chain. 
      Dim result = getNext()(input, getNext) 

      ' After invoking the method on the original target. 
      If result.Exception IsNot Nothing Then 
       WriteCriticalLog([String].Format("Method {0} threw exception {1} at {2}", input.MethodBase, result.Exception.Message, DateTime.Now.ToLongTimeString())) 
      Else 
       WriteLog([String].Format("Method {0} returned {1} at {2}", input.MethodBase, result.ReturnValue, DateTime.Now.ToLongTimeString())) 
      End If 

      Return result 
     End Function 

End Class 

::これは私がロガーにUnityの使用方法です

container.RegisterType(Of IXXXService, XXXService)(New Interceptor(Of InterfaceInterceptor)(), 
                   New InterceptionBehavior(Of LoggingInterceptionBehavior)) 
+0

コメントありがとうございました。私は、インターセプトされるべき異なる種類のクラスに対するインターセプタ(例えば、ロギングインターセプタ)の実装を1つ持っています。そして、そのようなクラスが解決されたかどうかを検出してログに記録します。最初のメソッドが呼び出されたときは最初ではありません。 – user2959547

+0

2つの答え。 1:これらの機能を利用するには、Unityに移行することをお勧めします。そうするには、少し習得する必要があります。 2:ドキュメントは少し疎です - https://github.com/castleproject/Windsor/blob/master/docs/debugger-views.md、それはあなたのコンテナをデバッグする方法をあなたに導くべきです。 – Programmer

+0

1.統一への移行は私の選択肢ではありません。私はCastle Windsorが大好きです;-)。 2:私は自分のコンテナをデバッグしたくありません。私はちょうどインターセプタを使用し、コンストラクタ内の呼び出しのターゲットへのアクセスを取得したい(それはインターセプトメソッドのために実装されているのと同じです)。 – user2959547

0

は、私はあなたがそれを必要とする理由を知りませんが、私は可能な2を考えることができますこのためのソリューション。

まず、container.ComponentRegisteredイベント(or some other event of your choosing)をフックし、ハンドラを調べてインターセプタを確認します。

第2に、インターセプタで静的ハッシュテーブルを使用し、インターセプトで「新しい」ターゲットが検出されたときにログに記録できます。

おそらく最初の解決策はあなたが望むものです。

関連する問題