コンポーネント登録をせずにDIしてインターセプタを適用
自動登録という機能があるわけではなく、Kernel(コンテナ)に問い合わせて存在しなかったらインスタンス化したりDIしてくれるようです。これは便利。
それと、IKernelのIntercept拡張メソッドを使うと条件に引っかかるメソッドにインターセプタが適用できます。下のコードでは全メソッドを対象にしています。
public class NinjectTest { [Fact] public void TestIntercept() { var kernel = new StandardKernel(new NinjectSettings{ LoadExtensions = false}, new DynamicProxy2Module()); kernel.Intercept(proxy => true).With<TraceInterceptor>(); var foo = kernel.Get<Foo>(); // Fooを登録せずにいきなりGet foo.DoFoo(); } }
public class Foo { [Inject] public Bar Bar { get; set;} public virtual void DoFoo() { Console.WriteLine("DoFoo invoked"); Bar.DoBar(); } }
public class Bar { public virtual void DoBar() { Console.WriteLine("DoBar invoked."); } }
public class TraceInterceptor : SimpleInterceptor { protected override void BeforeInvoke(IInvocation invocation) { Console.WriteLine("Before {0}", invocation.Request.Method.Name); } protected override void AfterInvoke(IInvocation invocation) { Console.WriteLine("After {0}", invocation.Request.Method.Name); } }
実行結果はこうなります。
Before DoFoo DoFoo invoked Before DoBar DoBar invoked. After DoBar After DoFoo
FooにBarがDIされていますし、両方に対してインターセプタがかかっています。