2016-07-30 6 views
0

sagen wir eine serverseitige App, die eine threadsichere Komponente ausgiebig nutzt. Anstatt jedes Mal, wenn es benötigt wird, eine neue Komponenteninstanz zu erstellen, verwende ich Autofac, um eine Singleton-Instanz dieser Komponente während des Systemstarts zu registrieren, zu verwalten und aufzulösen, wie beschrieben here.Wie verhält sich Autofac, wenn eine neue Komponenteninstanz programmgesteuert initialisiert wird, die als Singleton registriert wurde, bevor

Jetzt ist meine Frage: Was passiert, wenn trotz der Autofac-Registrierung eine neue Instanz dieser Komponente programmgesteuert (ComponentName c = new ComponentName();) irgendwo im Quellcode initialisiert wird.

Hier meine Annahmen sind:

(Fall 1) Wenn die Initialisierung Anweisung Teil des Quellcodes ist, die für die die Autofac DI-Container Autofac die registriert definiert wurden den App Montag gehört, zurückgeben Singleton-Instanz der Komponente.

(Fall 2) Wenn die Initialisierungsanweisung zum Quellcode einer externen Drittanbieterbibliothek gehört, wird bei jeder Ausführung der Anweisung eine neue Instanz der Komponente erstellt. Autofac hat keine Rolle.

Sind meine Annahmen in die richtige Richtung oder bin ich völlig falsch?

Grüße, Matthias

Antwort

1

Autofac nicht kontrolliert und ist nicht „bewusst“ von Objektinstanzen, dass es das Problem nicht. Wenn Sie eine Abhängigkeit als Singleton registrieren, teilt Autofac mit, wie die Abhängigkeit aufgelöst werden soll - um dieselbe Instanz wiederzuverwenden. In der Zwischenzeit können Sie beliebig viele Instanzen derselben Klasse erstellen.

Die Registrierung einer Abhängigkeit als Singleton macht die angegebene Klasse nicht wirklich zu einem Singleton. Bei einem "echten" Singleton kann nur eine Instanz der Klasse existieren, da jeder Aufruf zum Abrufen einer Instanz dieselbe Instanz zurückgibt. Wenn Sie die Abhängigkeit als Singleton registrieren, wird der Container angewiesen, sich so zu verhalten, als ob die Klasse ein Singleton wäre. Dabei wird eine Instanz wiederverwendet, statt neue zu erstellen.

+0

Hallo Scott, danke für die Klarstellungen. Ich verstehe jetzt. –

+0

Was ich daran mag, ist, dass wir den Vorteil haben, einen Singleton zu verwenden (indem wir eine einzelne Instanz verwenden, anstatt mehrere zu erstellen), ohne die Klasse als tatsächlichen Singleton schreiben zu müssen. –

Verwandte Themen