拦截器中断 属性 注入

Interceptor breaks property injection

我用Ninject。自绑定class的注入属性在class有拦截器时没有解析。使用最新的库:

  <package id="Castle.Core" version="3.2.0" targetFramework="net46" />
  <package id="Ninject" version="3.2.0.0" targetFramework="net46" />
  <package id="Ninject.Extensions.Interception" version="3.2.0.0" targetFramework="net46" />
  <package id="Ninject.Extensions.Interception.DynamicProxy" version="3.2.0.0" targetFramework="net46" />

Foo class自绑定:

public class Foo
{
    [Inject]
    public IBar Bar { get; set; }
}

public interface IBar
{
    void MyMethod();
}

public class Bar : IBar
{
    public void MyMethod() { }
}

拦截器:

public class TestInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();
    }
}

还有两个测试:

[Test]
public void Test1()
{
    var kernel = new StandardKernel();

    kernel.Bind<IBar>().To<Bar>();
    kernel.Bind<Foo>().ToSelf();

    var foo = kernel.Get<Foo>();

    Assert.IsNotNull(foo.Bar);
}

[Test]
public void Test2()
{
    var kernel = new StandardKernel();

    kernel.Bind<IBar>().To<Bar>();
    kernel.Bind<Foo>().ToSelf().Intercept().With<TestInterceptor>(); //the only diff

    var foo = kernel.Get<Foo>();

    Assert.IsNotNull(foo.Bar);
}

Test1 成功。 Test2 失败。为什么?这是预期的行为吗?

如果你像这样制作 Bar 属性 virtual 就可以了:

public class Foo
{
    [Inject]
    public virtual IBar Bar { get; set; }
}