C# Ninject工厂+;InCallScope+;语境保护
首先,我知道相关的帖子,但是那篇帖子很老了,更重要的是,没有直接回答 所以现在我使用了最新的Ninject(稳定的3.2Nuget软件包)和上述扩展,但仍然看到了一个不期望的行为C# Ninject工厂+;InCallScope+;语境保护,c#,ninject,ninject-extensions,C#,Ninject,Ninject Extensions,首先,我知道相关的帖子,但是那篇帖子很老了,更重要的是,没有直接回答 所以现在我使用了最新的Ninject(稳定的3.2Nuget软件包)和上述扩展,但仍然看到了一个不期望的行为 public interface IFoo {} public class Foo {} public class Parent { public IFoo foo; public IFoo foo2; public Func<IFoo> fooFactory; public Parent
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);
公共接口IFoo{}
公共类Foo{}
公共类父类{
公共伊福;
公共IFoo 2;
公共食品厂;
公共父级(IFoo、Func工厂){
this.foo=foo;
this.foodfactory=工厂;
}
public void init(){this.foo2=this.foodfactory();}
}
...
kernel.Bind().To().InCallScope();
var instance=kernel.Get();
init();
instance.foo.ShouldEqual(instance.foo2);
此测试失败,因此似乎没有为工厂函数保留上下文,并且它创建了一个新的Foo
如何实现预期的行为
更新
基于一条注释,我已经用一个声明的IFooFactory
接口尝试了相同的代码,该接口与ToFactory()
绑定。但行为是一样的
更新2
我刚刚尝试了最新的不稳定工厂和上下文保留扩展,结果仍然是一样的。有两个调用。一个是
kernel.Get()
,另一个是instance.init()
您是否尝试使用而不是?还没有,如果没有其他逻辑,我更喜欢使用委托。我现在就去试试。作者的便条可能表明你值得一试。引用:即使不需要争论,我个人认为工厂接口是一种更干净的工厂管理方式;虽然您确实需要编写更多的代码,但与Func相比,可读性的提高是值得的,实际上它也不适用于IFooFactory
。无论如何,可读性有时是主观的,如果我阅读Func
,我马上知道没有参数。在这种特殊情况下,我看到显式声明接口的唯一优点是更灵活的可扩展性。您能验证注入两个IFoo
实例是否会得到相同的结果吗?只是为了检查ContextPreservationExtension是否正确安装。我想最好扩展测试,将两个IFoo
s注入构造函数,并在工厂创建一个。