我不理解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
向我返回用于构造函数注入的相同实例。这可能吗?
答案 0 :(得分:4)
班级C
取决于IB
,而不是B
。
如果您这样做:
IB ib = kernel.Get<IB>();
并将其与c.b进行比较,如下所示:
var eq = ReferenceEquals(c.b, ib);
你会得到true
。
您所做的每次注册(B
和IB
)会为您提供不同的单身人士。
如果你想拥有相同的单身人士,你可以像这样进行一次注册:
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
}