【问题标题】:Ninject Factory + InCallScope + ContextPreservationNinject 工厂 + InCallScope + ContextPreservation
【发布时间】: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&lt;T&gt; 我立即知道没有参数。在这种特殊情况下,我认为显式声明接口的唯一优势是更灵活的可扩展性。
  • 您能否验证注入两个IFoo 实例会产生相同的结果?只是为了检查 ContextPreservationExtension 是否安装正确。我想最好将测试扩展为将两个IFoos 注入构造函数并通过工厂创建一个。

标签: c# ninject ninject-extensions


【解决方案1】:

有 2 个电话。一个是kernel.Get&lt;Parent&gt;(),另一个是instance.init()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多