Как мне убедиться, что NInject2 удаляет объекты в правильном порядке? - PullRequest
4 голосов
/ 24 января 2012

В частности, если я использую NInject для создания группы объектов, связанных в одноэлементной области, я ожидаю, что NInject освободит их в обратном порядке.

У меня есть следующий тестовый пример, я хочу знать, что я делаю что-то не так, или если в NInject2 есть ошибка.

Я ожидаю увидеть, что, учитывая, что я создал экземпляр Foo, а затем экземпляр Bar, NInject должен выпустить Bar прежде, чем выпустит Foo! Почему он этого не делает?

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 Ответ

3 голосов
/ 24 января 2012

Ninject не имеет подсчета ссылок в данный момент. Поэтому экземпляры располагаются в любом порядке. Если вы хотите этого, вам нужно написать реализацию ICache с подсчетом ссылок.

В качестве альтернативы вы можете использовать определить, что Foo находится в области видимости Bar, используя именованную область видимости. Это гарантирует, что Foo не будет утилизирован до Bar.

...