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
我只是试着用最新的不稳定工厂和现场保护扩展,结果还是一样。
您是否尝试使用[工厂界面](https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface)而不是[Func](https://github.com/ninject) /Ninject.Extensions.Factory/wiki/Func)? – kayess
还没有,如果没有其他逻辑,我更喜欢使用代表。我现在要试一试。 –
作者的说明可能表明你值得一试。 Quote:_即使没有参数我个人认为工厂界面是一个更清洁的方式来管理工厂;而你必须编写更多的代码,改进的可读性与Func相当值得努力_ –
kayess