2011-12-07 2 views
1

私は、どのクラス/メソッドがログに記録されるべきかを示すために、EntLibロギングと属性を使用してロギングフレームワークを構築しようとしています。だから私は迎撃が良い選択だと思う。私はNinjectとInterceptionのスーパーnoobです。属性を介した傍受の使い方についてはInnovatian Softwareのチュートリアルに従っています。しかし、私がアプリを実行すると、BeforeInvokeとAfterInvokeは決して呼び出されませんでした。助けてください、ありがとう!属性を介してNinject-Interceptionを取得できませんでした。何が間違っていましたか?

using System; 

using System.Diagnostics; 

using System.Collections.Generic; 

using Castle.Core; 

using Ninject; 

using Ninject.Extensions.Interception; 

using Ninject.Extensions.Interception.Attributes; 

using Ninject.Extensions.Interception.Request; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<ObjectWithMethodInterceptor>().ToSelf(); 

      var test= kernel.Get<ObjectWithMethodInterceptor>(); 
      test.Foo(); 
      test.Bar(); 
      Console.ReadLine(); 
     } 
    } 

    public class TraceLogAttribute : InterceptAttribute 
    { 
     public override IInterceptor CreateInterceptor(IProxyRequest request) 
     { 
      return request.Context.Kernel.Get<TimingInterceptor>(); 
     } 
    } 

    public class TimingInterceptor : SimpleInterceptor 
    { 
     readonly Stopwatch _stopwatch = new Stopwatch(); 
     protected override void BeforeInvoke(IInvocation invocation) 
     { 
      Console.WriteLine("Before Invoke"); 
      _stopwatch.Start(); 
     } 
     protected override void AfterInvoke(IInvocation invocation) 
     { 
      Console.WriteLine("After Invoke"); 
      _stopwatch.Stop(); 
      string message = string.Format("Execution of {0} took {1}.", 
              invocation.Request.Method, 
              _stopwatch.Elapsed); 
      Console.WriteLine(message); 
      _stopwatch.Reset(); 
     } 
    } 

    public class ObjectWithMethodInterceptor 
    { 
     [TraceLog] // intercepted 
     public virtual void Foo() 
     { 
      Console.WriteLine("Foo - User Code"); 
     } 
     // not intercepted 
     public virtual void Bar() 
     { 
      Console.WriteLine("Bar - User Code"); 
     } 
    } 

答えて

1

私は自動モジュールのロードを無効にしてきましたし、手動でカーネルにDynamicProxy2Moduleをロードする部分を逃し、それを考え出しました。コードへの変更は次のとおりです。

//var kernel = new StandardKernel(); //Automatic Module Loading doesn't work 
var kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = false }, new DynamicProxy2Module()); 

これは他の人の手助けをします。

関連する問題