コンポーネント登録をせずに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されていますし、両方に対してインターセプタがかかっています。