【发布时间】:2016-05-23 11:13:04
【问题描述】:
首先,我知道相关的帖子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。
如何实现预期的行为?
更新
根据评论,我尝试使用与ToFactory() 绑定的声明IFooFactory 接口的相同代码。不过行为是一样的。
更新 2
我刚刚尝试了最新的不稳定工厂和上下文保存扩展,结果还是一样。
【问题讨论】:
-
您是否尝试使用Factory interface 而不是Func?
-
还没有,如果除此之外没有其他逻辑,我更喜欢使用委托。我现在就试试。
-
作者的注释可能表明您值得一试。 Quote: 即使不带参数,我个人认为工厂接口是管理工厂的一种更清洁的方式;虽然您确实需要编写更多代码,但与 Func
相比,改进的可读性值得付出努力 -
实际上它也不适用于
IFooFactory。无论如何,可读性有时是主观的,如果我阅读Func<T>我立即知道没有参数。在这种特殊情况下,我认为显式声明接口的唯一优势是更灵活的可扩展性。 -
您能否验证注入两个
IFoo实例会产生相同的结果?只是为了检查 ContextPreservationExtension 是否安装正确。我想最好将测试扩展为将两个IFoos 注入构造函数并通过工厂创建一个。
标签: c# ninject ninject-extensions