如何确保NInject2以正确的顺序处理对象?

时间:2012-01-24 06:05:59

标签: ninject ninject-2

具体来说,如果我使用NInject创建一组绑定在单一范围内的对象,我希望NInject以相反的顺序释放它们。

我有一个如下测试用例,我想知道我做错了什么,或者NInject2是否有错误。

我希望看到,鉴于我已经创建了一个Foo实例,然后是一个Bar实例,NInject应该在它释放Foo之前​​释放Bar!为什么不这样做?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ninject;

namespace ConsoleApplication1
{
    interface IFoo
    {
    }

    interface IBar
    {
    }

    class Foo : IFoo, IDisposable
    {
        public Foo()
        {
            System.Console.WriteLine("Created Foo Instance");
        }
        public void Dispose()
        {
            System.Console.WriteLine("Disposed Foo Instance");
        }
    }

    class Bar : IBar, IDisposable
    {
        public Bar(IFoo foo)
        {
            System.Console.WriteLine("Created Bar Instance");
        }
        public void Dispose()
        {
            System.Console.WriteLine("Disposed Bar Instance");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var kernel = new Ninject.StandardKernel())
            {
                kernel.Bind<IBar>().To<Bar>().InSingletonScope();
                kernel.Bind<IFoo>().To<Foo>().InSingletonScope();

                kernel.Get<IFoo>();
                kernel.Get<IBar>();
            }
        }
    }
}

实际输出:

Created Foo Instance
Created Bar Instance
Disposed Foo Instance
Disposed Bar Instance

预期产出:

Created Foo Instance
Created Bar Instance
Disposed Bar Instance
Disposed Foo Instance

1 个答案:

答案 0 :(得分:3)

Ninject目前没有引用计数。因此,实例以任何顺序排列。如果你想要这个,你必须编写一个具有引用计数的ICache实现。

或者,您可以使用命名范围定义Foo在Bar的范围内。这将确保Foo不会在Bar之前处理。