具体来说,如果我使用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
答案 0 :(得分:3)
Ninject目前没有引用计数。因此,实例以任何顺序排列。如果你想要这个,你必须编写一个具有引用计数的ICache实现。
或者,您可以使用命名范围定义Foo在Bar的范围内。这将确保Foo不会在Bar之前处理。