2016-05-19 14 views
1

Nehmen wir an, ich habe einen IOC-Container. Ich benutze diesen Container einen Logger mit einem Singleton Lebensstil zu registrieren:SimpleInjector Singleton LifeStyle in Web

var container = new Container(); 
container.Register<ILogger, Logger>(LifeStyle.Singleton); 

Nun, wenn ich diesen Singleton verwende, wird es nur eine Instanz sein für sie geschaffen. Aber meine Frage ist zum Beispiel für ein ASP.NET-Web. Ist das dieselbe Instanz, die über die gesamte Anwendung für diesen einen Benutzer oder für JEDEN Benutzer auf meiner Website verwendet wird?

Was ist, wenn es für jeden Benutzer ist und der Logger beschäftigt ist, etwas zu loggen und ein anderer Benutzer versucht, etwas zu loggen? Wird das einen Fehler auslösen? (Was ich meine ... was ist die beste Praxis für einen Logger?)

+0

Die Thread-Sicherheit des Loggers ist auf die Logger-Implementierung zurückzuführen. Auf welchen Logger zielen Sie? – qujck

+0

NLOG oder Log4Net – RubenHerman

+0

sollte in Ordnung sein, und überprüfen Sie [serilog] (http://serilog.net/), es ist gut – qujck

Antwort

2

The Simple Injector Dokumentation states:

Es wird höchstens eine Instanz des registrierten Service-Typ sein und der Behälter wird halten auf diese Instanz, bis der Container entsorgt wird oder außerhalb des Geltungsbereiches liegt. Clients erhalten immer dieselbe Instanz aus dem Container. [...] Simple Injector garantiert, dass es höchstens eine Instanz des registrierten Singleton in dieser Container-Instanz gibt, aber wenn mehrere Container-Instanzen erstellt werden, erhält jede Container-Instanz ihre eigene Instanz des registrierten Singleton.

Another part der Dokumentation beschreibt, dass:

Sie typischerweise eine einzige Container-Instanz für die gesamte Anwendung (eine Instanz pro Anwendungsdomäne) schaffen sollten; Container-Instanzen sind Thread-sicher.

Dies bedeutet, dass, da Sie in der Regel nur eine Container-Instanz zu schaffen, wird Singleton Anmeldungen nur eine Instanz für die gesamte AppDomain haben. Daher wird jeder Benutzer und jede Anfrage dieselbe Instanz verwenden.

Es liegt in Ihrer Verantwortung sicherzustellen, dass eine solche Implementierung Thread-sicher ist und von mehreren Threads parallel verwendet werden kann.

Falls Sie nicht Thread-Sicherheit, wie zum Beispiel soll registriert werden als Scoped oder Transient garantieren können.

Sie sollten in der Dokumentation der verwendeten Protokollbibliothek nachsehen, ob Instanzen des Typs threadsicher sind oder nicht.

Anstatt eine Bibliotheksabstraktion eines Drittanbieters in Ihren Code einzufügen, sollten Sie das alternative Design berücksichtigen, das here beschrieben wurde.