我目前正在为一个项目测试一些 IoC 框架,我希望能够使用 Ninject 3。
我遇到了一个问题,在我配置绑定到具体类型的单例之后,我似乎无法在以后有效地取消绑定服务类型。即StandardKernel.TryGet<T>()
调用后返回非空值StandardKernel.Unbind<T>()
。有关我的确切用法,请参见下面的代码段。
这是 Ninject 3 中的错误,还是我遗漏了什么?
作为一种解决方法,我可以简单地将具体类型重新绑定到一个常量空值。但在我回到那个位置之前,我更愿意了解我是否没有在摸索什么。
顺便说一句,如果我在单例范围内指定绑定到具体类型的接口,但对于单例范围内的自绑定具体类型,则取消绑定按预期工作。如果这不是一个错误(以及额外的业力),你能解释为什么行为会有所不同吗?
public class MyServiceType : IDisposable
{
public bool IsDisposed { get; private set; }
public void Dispose()
{
IsDisposed = true;
}
}
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind<MyServiceType>().ToSelf().InSingletonScope();
var instance = kernel.TryGet<MyServiceType>();
Debug.Assert(instance != null && !instance.IsDisposed);
// release the instance
kernel.Release(instance);
Debug.Assert(instance.IsDisposed);
instance = null;
// unbind the service
kernel.Unbind<MyServiceType>();
// uncomment below for workaround
// kernel.Rebind<MyServiceType>().ToConstant((MyServiceType)null);
// after unbinding should no longer be able to get an instance of the service
instance = kernel.TryGet<MyServiceType>();
Debug.Assert(instance == null); // <---- this is failing!
}