2009-08-18 8 views
3

Meine Anwendung verwendet NHibernate mit einer Sitzung pro Anforderung Implementierung. Ich habe eine Kernbibliothek, die eine Thread-sichere Singleton für den Zugriff auf die aktuelle Nhibernate-Sitzung bietet.Ninject und Singleton

Dieser Singleton wird von der Webanwendung in den Ereignissen BeginRequest und EndRequest genutzt, um das Öffnen und Schließen der Sitzung bei jeder Anforderung sicherzustellen. Darüber hinaus verwendet meine DataAccess-Ebene den gleichen Singleton für den Datenzugriff, sodass dieselbe Nhibernate-Sitzung genutzt wird.

Ich habe jetzt Ninject in die Gleichung hinzugefügt, so dass ich zur Laufzeit die NHibernate Kontextinformationen, nämlich die Verbindungszeichenfolge ableiten kann. Ich möchte einen Wert in meiner Webkonfiguration ändern, der sagt, welche Datenbank es trifft. Das Problem ist, dass ich, um dies zu tun, mein Singleton (oben erwähnt) in der Lage sein muss, eine seiner Eigenschaften, IConnectionStringProvider, abzuleiten.

Es ist richtig verdrahtet, aber der Singleton wird nie instanziierte Eigenschaften haben, daher bricht alles.

Also zu meiner Frage ... wie kann ich Ninject mit einem Singleton arbeiten, oder wie kann ich meine Implementierung ändern, um mit Ninject zu arbeiten?

Antwort

1

Dies ist ein häufiges Problem, dass viele Menschen mit Singletons begegnen. Während ich speziell über NHibernate nicht kommentieren kann, überprüfen Sie Misko's Article auf, warum das Singleton-Entwurfsmuster von dem Problem leidet, das Sie beschreiben. Achten Sie darauf, die Kommentare und verknüpften Artikel zu lesen, um herauszufinden, was Sie dagegen tun können (oder suchen Sie "Wo sind alle Singletons gegangen?" Auf Google).

Wenn Sie an diesem Thema interessiert sind, können Sie auch wollen "Singleton-i-love-you-but-youre-bringen-me-down"

Hoffentlich Google, die ein wenig hilft.

2

Vielleicht könnten Sie versuchen, die Singletons auf eine konstante Bindung wie so

Bind<ISession>().ToConstant(SessionSingleton.Instance); 

ich dies tun mit dem Settings.Default Singletons des Objekts Einstellungen (meist als Patch-Methode, bis ich Zeit habe, mit wirklich zu spielen meine Einstellungen) und es funktioniert sehr gut.