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: 即使不带参数,我个人认为工厂接口是管理工厂的一种更清洁的方式;虽然您确实需要编写更多代码,但与 FuncIFooFactory
。无论如何,可读性有时是主观的,如果我阅读Func<T>
我立即知道没有参数。在这种特殊情况下,我认为显式声明接口的唯一优势是更灵活的可扩展性。
您能否验证注入两个IFoo
实例会产生相同的结果?只是为了检查 ContextPreservationExtension 是否安装正确。我想最好将测试扩展为将两个IFoo
s 注入构造函数并通过工厂创建一个。
【参考方案1】:
有 2 个电话。一个是kernel.Get<Parent>()
,另一个是instance.init()
。
【讨论】:
以上是关于Ninject 工厂 + InCallScope + ContextPreservation的主要内容,如果未能解决你的问题,请参考以下文章
中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题
ninject 继承安全规则违反了类型:mvc4 中的“Ninject.Web.Mvc.Filter.FilterContextParameter”