如何将实例 ninject 传递给构造函数
How to get the instance ninject passes into a constructor
我不理解 ninject 单身人士的这种行为。这是一个简单的例子。
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;
}
}
我不明白为什么 ReferenceEquals(c.b, b)
return 是错误的。
我假设如果我将一个对象声明为单例,那么 ninject 将只使用该对象的一个实例,但事实似乎并非如此。
根据我的测试,它似乎使用一个实例进行构造函数注入,并在我调用 kernel.Get
.
时将一个实例用于 return
我想要 kernel.Get
到 return 对我来说是用于构造函数注入的同一个实例。这可能吗?
我刚刚解决了我自己的问题。
这是因为我在 B
上打电话给 kernel.Get
而不是 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
}
Class 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();
我不理解 ninject 单身人士的这种行为。这是一个简单的例子。
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;
}
}
我不明白为什么 ReferenceEquals(c.b, b)
return 是错误的。
我假设如果我将一个对象声明为单例,那么 ninject 将只使用该对象的一个实例,但事实似乎并非如此。
根据我的测试,它似乎使用一个实例进行构造函数注入,并在我调用 kernel.Get
.
我想要 kernel.Get
到 return 对我来说是用于构造函数注入的同一个实例。这可能吗?
我刚刚解决了我自己的问题。
这是因为我在 B
上打电话给 kernel.Get
而不是 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
}
Class 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();