如何解除绑定一个具体的自我约束辛格尔顿Ninject 3绑定?(How to unbind a co

2019-09-22 09:23发布

我目前正在测试一些IoC框架的一个项目,我很想能够使用Ninject 3。

我运行到那里后,我配置绑定到具体类型的单一个问题,我似乎无法有效地解除绑定的服务类型以后。 也就是说, StandardKernel.TryGet<T>()返回调用之后的非空值StandardKernel.Unbind<T>() 请参阅下面我详细的用法片段。

这是Ninject 3中的错误,或者是有什么我失踪?

作为一种变通方法,我可以简单地重新绑定的具体类型,以恒定的空值。 但我更愿意理解如果我不所著的Grokking东西之前,我退回到那个位置。

顺便说一句,如果我指定绑定到单范围内的具体类型的接口拆散的作品如预期,但不适合在单身范围自势必具体类型。 如果这是不是一个错误(和额外的业力),你能解释一下为什么会出现行为上的差异?

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!
}

Answer 1:

这是因为Ninject将尝试构建即使没有绑定你的对象。 如果它有一个参数的构造函数,它将使用,否则会尝试使用该货柜被发现的依赖关系,构建它。

为了证实这一点,即使你跳过MyServiceType的初始绑定,还是做一个TryGet,你会得到一个实例。

或者,你可以尝试解决该实例已绑定和释放后,并声称他们是同一类的不同逸岸实例。



文章来源: How to unbind a concrete self-bound singleton binding in Ninject 3?
标签: c# ninject