2012-04-12 105 views
2

我正在測試Ninject並試圖瞭解如何將資源庫注入單例類。 以下工作信息庫和單類的例子...獲取單例實例

public interface ITestRepository 
{ 
    void TestRepositoryMethod(); 
} 

public class TestRepository:ITestRepository 
{ 
    public void TestRepositoryMethod() 
    { 

    } 
} 

public class TestSingletonInjectionClass 
{ 
    private readonly ITestRepository _repository; 

    public TestSingletonInjectionClass(
     ITestRepository repository) 
    { 
     _repository = repository; 
    } 

    public void TestMethod() 
    { 

    } 
} 

的測試方法,通過sucesfully

[TestMethod] 
public void SimpleTestSingleton() 
{ 
    using (IKernel kernel = new StandardKernel()) 
    { 
     kernel.Bind<ITestRepository>().To<TestRepository>(); 
     var testSingletonInjectionClass = 
      kernel.Get<TestSingletonInjectionClass>();\ 

     Assert.IsNotNull(testSingletonInjectionClass); 
    } 
} 

我有兩個問題

是得到這個正確的方法單例類實例?

kernel.Get<TestSingletonInjectionClass>() 

2.如何從應用程序代碼的單一實例類。在測試方法中,我創建Ninject內核並訪問Get方法。如何訪問ninject內核表單代碼?

回答

5

您必須配置的類是單:通過將其傳遞到消費類的構造函數

kernel.Bind<TestSingletonInjectionClass>().ToSelf().InSingletonScope(); 

在你得到它的實現。

public class Foo 
{ 
    public Foo(TestSingletonInjectionClass testSingletonInjectionClass) 
    { 
     this.testSingletonInjectionClass = testSingletonInjectionClass; 
    } 
} 
+0

請問如何在構造函數中獲取類的實例?非常感謝您的幫助。 – Tomas 2012-04-12 15:10:02

+0

只需將其作爲構造函數參數添加即可。 – 2012-04-12 15:20:43

+0

我使用這個實現遇到的一個問題是,如果我在抽象類中添加這樣的構造函數,派生類也需要相同的構造函數,並且有時會帶來問題。 – Tomas 2012-04-17 12:29:56

0

正如你可以ninject文檔(https://github.com/ninject/ninject/wiki/Object-Scopes)一個「InSingletonScope」上閱讀創造了一個「生活的單身風格」,而不是傳統的單。該文檔說:

「只會創建一個類型的單個實例,並將爲每個後續請求返回相同的實例。」

這意味着您將只有一個實例x容器。如果有人使用另一個容器,將得到另一個實例。

+0

創建一個全局範圍的單例是非常困難的,我認爲它們不是這樣。 – 2012-04-16 13:42:21