C# Ninject工厂+;InCallScope+;语境保护

C# Ninject工厂+;InCallScope+;语境保护,c#,ninject,ninject-extensions,C#,Ninject,Ninject Extensions,首先,我知道相关的帖子,但是那篇帖子很老了,更重要的是,没有直接回答 所以现在我使用了最新的Ninject(稳定的3.2Nuget软件包)和上述扩展,但仍然看到了一个不期望的行为 public interface IFoo {} public class Foo {} public class Parent { public IFoo foo; public IFoo foo2; public Func<IFoo> fooFactory; public Parent

首先,我知道相关的帖子,但是那篇帖子很老了,更重要的是,没有直接回答

所以现在我使用了最新的Ninject(稳定的3.2Nuget软件包)和上述扩展,但仍然看到了一个不期望的行为

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);
公共接口IFoo{}
公共类Foo{}
公共类父类{
公共伊福;
公共IFoo 2;
公共食品厂;
公共父级(IFoo、Func工厂){
this.foo=foo;
this.foodfactory=工厂;
}
public void init(){this.foo2=this.foodfactory();}
}
...
kernel.Bind().To().InCallScope();
var instance=kernel.Get();
init();
instance.foo.ShouldEqual(instance.foo2);
此测试失败,因此似乎没有为工厂函数保留上下文,并且它创建了一个新的
Foo

如何实现预期的行为

更新

基于一条注释,我已经用一个声明的
IFooFactory
接口尝试了相同的代码,该接口与
ToFactory()
绑定。但行为是一样的

更新2


我刚刚尝试了最新的不稳定工厂和上下文保留扩展,结果仍然是一样的。

有两个调用。一个是
kernel.Get()
,另一个是
instance.init()

您是否尝试使用而不是?还没有,如果没有其他逻辑,我更喜欢使用委托。我现在就去试试。作者的便条可能表明你值得一试。引用:即使不需要争论,我个人认为工厂接口是一种更干净的工厂管理方式;虽然您确实需要编写更多的代码,但与Func相比,可读性的提高是值得的,实际上它也不适用于
IFooFactory
。无论如何,可读性有时是主观的,如果我阅读
Func
,我马上知道没有参数。在这种特殊情况下,我看到显式声明接口的唯一优点是更灵活的可扩展性。您能验证注入两个
IFoo
实例是否会得到相同的结果吗?只是为了检查ContextPreservationExtension是否正确安装。我想最好扩展测试,将两个
IFoo
s注入构造函数,并在工厂创建一个。