首先,我知道相关帖子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
我刚试过最新的不稳定工厂和上下文保留扩展,结果仍然相同。
答案 0 :(得分:0)
有2个电话。一个是kernel.Get<Parent>()
,另一个是instance.init()
。