2017-04-11 2 views
0

Ich habe eine Unit of Work Wrapper für meine Nhibernate Datenzugriffsmethoden erstellt. Ich initialisiere meine Session Factory im Static Constructor der UnitOfWork-Klasse, in der Hoffnung, sie einmalig initialisieren zu können.Erstellen Sie eine ninject Abhängigkeit mit statischen Konstruktor

public class UnitOfWork : IUnitOfWork 
{ 
    private static readonly ISessionFactory _sessionFactory; 
    static UnitOfWork() 
    { 
     var oracleConfiguration = OracleDataClientConfiguration.Oracle10.ConnectionString(ConfigurationManager.ConnectionStrings[Constants.CONNECTION_STRING].ConnectionString); 
     _sessionFactory = Fluently.Configure() 
          .Database(oracleConfiguration) 
          .Mappings(m => m.FluentMappings.Add<MyMap>()) 
          .BuildSessionFactory(); 
    } 
} 

ich dann binde diese unitOfWork Abhängigkeit mit Ninject Kernel während meines Starts der Anwendung und dann erwarten, dass Ninject es in meinen Daten des Zugangs Repository Konstruktor zu lösen. (Ich verwende Constructor-Injektion).

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    }                  
} 

Aber nach Auflösung, konnte ich verstehen, dass der Code innerhalb des statischen Konstruktor nie bei der Objekterstellung und als Ergebnis meiner Nhibernate Session Fabrik ist null ausgeführt wurde.

Ich bin mir sicher, dass mir hier etwas fehlt. Könnte jemand mir helfen zu verstehen, wie man den statischen Konstruktor in Ninject richtig benutzt?

Dank

+0

Sie müssen Ihre Arbeitseinheit nicht statisch einstellen. Es sollte ohne statisches Schlüsselwort funktionieren. – OrcusZ

+0

Wenn ich es nicht mit meiner aktuellen Ninject-Bindungskonfiguration auf statisch setze, würde dies dazu führen, dass Ninject IOC separate Session Factories für jede Auflösung erstellt. – Dinny

Antwort

1

Sie möchten Ihre UOW Konstruktor nur einmal ausgeführt werden, so dass es statisch erklären Sie. Warum nicht, aber es sollte nicht mit einem Zugriffsmodifikator kompiliert werden (das Schlüsselwort public). Der statische Konstruktor akzeptiert keine Zugriffsmodifizierer (oder Argumente). Sind Sie sicher, dass Ihr Code gültig ist?

Ich vermute, Sie haben tatsächlich ohne den ungültigen Zugriffsmodifikator versucht.

Ich weiß nicht, wie ein Typ verwendet werden könnte, ohne zuerst seinen statischen Konstruktor auszulösen. Vielleicht ist NInject dazu in der Lage. In einem solchen Fall, falle einfach zurück zu einer saubereren Lösung: füge deine Session-Factory zu NInject mit einem Singleton-Lebenszyklus und entsprechendem Code hinzu, um es zu instanziieren (im Grunde was dein aktueller Uow-Konstruktor tut) und richte deinen Uow so ein, dass er es als Abhängigkeit hat.

+0

Mein Fehler, ich tippte den Code selbst in die Frage und vergaß den Zugriffsmodifikator in meinem statischen Konstruktor. Ich werde es jetzt korrigieren. Ich habe Ihren Vorschlag ausprobiert und es hat auch wie erwartet funktioniert. Meine Bindung ist "Bind (). Zu () .InSingletonScope();" und ich habe meinen statischen Konstruktor in Public Instance Constructor geändert. Danke :) – Dinny

+0

@Dinny es ist Kultur zu bewerten/bewerten Antworten auf Ihre Frage, sollten Sie vor allem die beste Antwort tatsächlich beantworten Ihre Frage und es ist auch üblich, über die anderen Antworten abstimmen. Siehe auch http://stackoverflow.com/help/accepted-answer – BatteryBackupUnit

Verwandte Themen