2012-04-12 8 views
2

Ich teste Ninject und versuchen zu verstehen, wie Repository zu Singleton-Klasse injizieren. Im Folgenden arbeitet Repository und Singletonklasse Beispiel ...Get Singleton Instanz

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() 
    { 

    } 
} 

Das Testverfahren, das

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

     Assert.IsNotNull(testSingletonInjectionClass); 
    } 
} 

sucesfully gebe ich zwei Fragen

1. Ist das richtige Methode zu erhalten Singleton-Klasseninstanz?

kernel.Get<TestSingletonInjectionClass>() 

2. Wie von App-Code Singleton-Instanz der Klasse erhalten. In der Testmethode erstelle ich Ninject Kernel und greife auf Methode Get. Wie kann man auf den Formularcode des ninject-Kernels zugreifen?

Antwort

5

Sie müssen konfigurieren, dass die die Klasse ein Singleton:

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

In den Implementierungen Sie es erhalten, indem es an den Konstruktor der Klasse raubend vorbei.

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

Könnten Sie bitte Code, wie Instanz der Klasse im Konstruktor erhalten? Vielen Dank für Ihre Hilfe. – Tomas

+0

Fügen Sie es einfach als Konstruktorparameter hinzu. –

+0

Das eine Problem, das ich mit dieser Implementierung erfüllt, ist, dass, wenn ich einen solchen Konstruktor in der abstrakten Klasse hinzufüge, die abgeleiteten Klassen auch den gleichen Konstruktor benötigen und manchmal bringt dies Probleme mit sich. – Tomas

0

Wie Sie auf ninject Dokumentation (https://github.com/ninject/ninject/wiki/Object-Scopes) ein „InSingletonScope“ erzeugt eine „Singleton Art des Lebens“, kein traditionelles Singleton lesen . Die Dokumentation lautet:

"Nur eine einzige Instanz des Typs wird erstellt, und die gleiche Instanz wird für jede nachfolgende Anfrage zurückgegeben."

Dies bedeutet, dass Sie nur einen Instanz x Container haben. Wenn jemand einen anderen Container verwendet, erhält er eine andere Instanz.

+0

Es ist ziemlich schwierig, ein global begrenztes Singleton zu erstellen, und ich glaube nicht, dass es das ist, wonach sie auch waren. –