如何将实例ninject传递给构造函数

时间:2015-12-21 21:39:50

标签: c# singleton ninject

我不理解ninject单身人士的这种行为。这是一个简单的例子。

if(a.style.backgroundImage.indexOf('url("open.png")') >= 0){
    alert("help");
    a.style.backgroundImage='url("navopen.png")';
}

我不明白为什么void Main() { IKernel kernel = new StandardKernel(); kernel.Bind<IB>().To<B>().InSingletonScope(); kernel.Bind<B>().To<B>().InSingletonScope(); C c = kernel.Get<C>(); B b = kernel.Get<B>(); B b2 = kernel.Get<B>(); ReferenceEquals(c.b, b); //false ReferenceEquals(b, b2); //true } public interface IB { } public class B : IB { } public class C { public IB b; public C(IB b) { this.b = b; } } 会返回false。

我假设如果我将一个对象声明为一个单例,那么ninject将只使用该对象的一个​​实例,但看起来并非如此。

根据我的测试,它似乎使用一个实例进行构造函数注入,并在调用ReferenceEquals(c.b, b)时返回一个实例。

我想要的是kernel.Get向我返回用于构造函数注入的相同实例。这可能吗?

2 个答案:

答案 0 :(得分:4)

班级C取决于IB,而不是B

如果您这样做:

IB ib = kernel.Get<IB>();

并将其与c.b进行比较,如下所示:

var eq = ReferenceEquals(c.b, ib);

你会得到true

您所做的每次注册(BIB)会为您提供不同的单身人士。

如果你想拥有相同的单身人士,你可以像这样进行一次注册:

kernel.Bind<IB,B>().To<B>().InSingletonScope();

答案 1 :(得分:1)

我刚刚解决了自己的问题。

这是因为我在kernel.Get上呼叫B而不是IB

void Main()
{
    IKernel kernel = new StandardKernel();
    kernel.Bind<IB>().To<B>().InSingletonScope();
    kernel.Bind<B>().To<B>().InSingletonScope();

    C c = kernel.Get<C>();
    B b = kernel.Get<B>();
    B b2 = kernel.Get<B>();
    IB b3 = kernel.Get<IB>();

    ReferenceEquals(c.b, b); //false
    ReferenceEquals(c.b, b3); //true
    ReferenceEquals(b, b2); //true
}