2016-02-12 42 views
3

首先,我知道相关的帖子here,但那篇文章已经很老了,更重要的是,没有直接回答。Ninject Factory + InCallScope + ContextPreservation

因此,现在我使用最新的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

如何达到预期的行为?

更新基于我试过用ToFactory()约束声明的IFooFactory接口相同的代码中的注释

。行为虽然相同。

更新2

我只是试着用最新的不稳定工厂和现场保护扩展,结果还是一样。

+0

您是否尝试使用[工厂界面](https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface)而不是[Func](https://github.com/ninject) /Ninject.Extensions.Factory/wiki/Func)? – kayess

+0

还没有,如果没有其他逻辑,我更喜欢使用代表。我现在要试一试。 –

+0

作者的说明可能表明你值得一试。 Quote:_即使没有参数我个人认为工厂界面是一个更清洁的方式来管理工厂;而你必须编写更多的代码,改进的可读性与Func 相当值得努力_ – kayess

回答

0

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