Ninject Factory + InCallScope + ContextPreservation

时间:2016-02-12 10:31:45

标签: c# ninject ninject-extensions

首先,我知道相关帖子here,但该帖子已经过时了,更重要的是,没有直接回答。

所以现在我使用最新的Ninject(稳定的,3.2 Nuget包)和上面提到的扩展,仍然看到了非预期的行为。

public interface IFoo {}
public class Foo {}

public class Parent {
  public IFoo foo;
  public IFoo foo2;
  public Func<IFoo> fooFactory;
  public Parent(IFoo foo, Func<IFoo> factory) {
    this.foo = foo;
    this.fooFactory = factory;
  }
  public void init() { this.foo2 = this.fooFactory(); }
}

...

kernel.Bind<IFoo>().To<Foo>().InCallScope();
var instance = kernel.Get<Parent>();
instance.init();
instance.foo.ShouldEqual(instance.foo2);

此测试失败,因此似乎不会为工厂函数保留上下文,并且它会创建一个新的Foo

如何实现预期的行为?

更新

根据评论,我尝试使用与IFooFactory绑定的声明ToFactory()接口的相同代码。但行为是一样的。

更新2

我刚试过最新的不稳定工厂和上下文保留扩展,结果仍然相同。

1 个答案:

答案 0 :(得分:0)

有2个电话。一个是kernel.Get<Parent>(),另一个是instance.init()