Ninject 工厂 + InCallScope + ContextPreservation

Posted

技术标签:

【中文标题】Ninject 工厂 + InCallScope + ContextPreservation【英文标题】:Ninject Factory + 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 注入构造函数并通过工厂创建一个。 【参考方案1】:

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

【讨论】:

以上是关于Ninject 工厂 + InCallScope + ContextPreservation的主要内容,如果未能解决你的问题,请参考以下文章

中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题

ninject 继承安全规则违反了类型:mvc4 中的“Ninject.Web.Mvc.Filter.FilterContextParameter”

Ninject之旅之七:Ninject依赖注入

依赖注入(DI)和Ninject,Ninject

Ninject

使用 Ninject