Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 在Ninject v1中重置IKernel_Dependency Injection_Ioc Container_Ninject - Fatal编程技术网

Dependency injection 在Ninject v1中重置IKernel

Dependency injection 在Ninject v1中重置IKernel,dependency-injection,ioc-container,ninject,Dependency Injection,Ioc Container,Ninject,我遇到了Ninject的v1和重置StandardKernel的问题。我有一个静态对象,用于提供对内核的访问,如下所示 public static class ObjectFactory { private static IKernel _kernel = new StandardKernel(new CanceisModule()); // Resolve methods snipped for brevity public static void Reset()

我遇到了Ninject的v1和重置StandardKernel的问题。我有一个静态对象,用于提供对内核的访问,如下所示

public static class ObjectFactory
{
    private static IKernel _kernel =  new StandardKernel(new CanceisModule());

    // Resolve methods snipped for brevity

    public static void Reset()
    {
        _kernel = null;
        _kernel = new StandardKernel(new CanceisModule());
    }
}
当我尝试在各种单元测试(我使用MSTest)或fitnesse装置中使用ObjectFactory时,就会出现问题。我总是在每次新的测试或夹具之前调用ObjectFactory.Reset()方法,但有时似乎重置实际上不起作用,并保留原始绑定。我知道有一种方法可以重置Ninject v2中的IKernel对象,但我们还没有准备好进行这一操作(这对我们来说是一个相当重要的操作)

有人能提供一些关于为什么会发生这种情况的建议吗?我猜这与在不同运行程序中的不同线程上执行测试的方式有关,但如何避免呢


提前感谢

您的方法似乎很好

一般来说,测试运行程序不会运行多线程或任何您所猜测的神奇功能

我建议在Reset()中设置断点并调试测试

您的代码在一个静态类中有一个非静态方法,那么您是否还遗漏了其他内容


当你说“新测试或夹具”时,是哪个?通常情况下,如果您在测试中使用Ninject,最好将内核保留在基类中,并确保在正确的时间重置,以避免任何混淆或怀疑[而不是依赖对象工厂“singleton”]。

非静态重置是一个输入错误(我的办公桌上没有互联网,因此我必须尽可能复制)。当我调试测试时(MSTest或Fitnesse中都会出现这种行为),Reset方法总是有效的。这就是为什么如此令人困惑。当我说“新的测试或夹具”时,我的意思是这两种情况都会发生。在fixture中,我总是在fixture本身的构造函数中调用ObjectFactory.Reset。在MSTest中,我有一个基类,每个其他类都从该基类派生,在每次测试之前使用[TestInitialize]属性化方法调用ObjectFactory.Reset()。还有其他猜测吗?是不是仅仅像在Reset()中那样释放对旧内核的引用并不会触发在正确的点上处理(和最终确定)对象?如果您依靠清理来删除指向共享对象等的链接,这可能会延迟到GC时间。我不是MSTest专家,但TestInitialize似乎是放置它的最安全默认位置(出于隔离原因)。一句话:select和测试框架都没有被破坏——很可能你的对象在模块中存在某种东西,这意味着它们没有正确地清理自己。Haviong说,对我来说,在NUnit和xUnit.net中启动时对什么做什么和不做什么的困惑消失了。很抱歉,我浪费了这么多时间来追踪复杂的测试初始化层次结构。谢谢鲁本的建议。我想我可能最终会迷恋上xUnit。。。它更干净,更容易使用