拦截器中断 属性 注入
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; }
}
我用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; }
}