2015-12-21 70 views
2

實例我不明白ninject單身的這種行爲。這是一個簡單的例子。如何獲得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)返回false。

我會假設,如果我聲明一個對象作爲單身然後ninject將只使用對象的單個實例,但是,似乎並非如此。

根據我的測試,似乎使用一個實例進行構造函數注入,並在調用kernel.Get時返回給我一個實例。

我想要的是kernel.Get返回給我用於構造函數注入的同一個實例。這可能嗎?

+2

類型'B'和'IB'是不同的,你創建兩個不同的綁定,所以你有兩個單身'B'和'IB'其解析爲'B'類型的實例。 –

回答

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

我只是解決了我的問題。

這是因爲我打電話kernel.GetBIB

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 
} 
相關問題