Ich verwende Ninject, um meine Sitzung für eine Web-API/MVC-Anwendung zu verwalten. Der Code lautet wie folgt:Ninject 3.2 OnDeactivation nicht feuern Web API
Bind<ISession>().ToMethod(c => c.Kernel.Get<ISessionFactory>().OpenSession())
.InRequestScope()
.OnActivation(s => s.BeginTransaction())
.OnDeactivation((s) =>
{
try
{
s.Transaction.Commit();
}
catch (Exception e)
{
s.Transaction.Rollback();
}
s.Close();
s.Dispose();
});
}
Der OnActivation Code korrekt genannt wird - wenn die Sitzung eine Transaktion begonnen wird injiziert wird. Wenn die Anforderung jedoch beendet wird, wird die Ondeaktivierung nicht aufgerufen. Daher kann ich Dinge aus der Datenbank abfragen, aber keine Änderungen festschreiben (es sei denn, ich übertrage die Transaktion anderswo).
Ich bin nicht wirklich sicher, warum die OnDeactivation nicht aufgerufen wird - fehle ich etwas in meinem Ninjizieren Setup?
notiert - wird das Commit an anderer Stelle verschieben. mein Problem war, dass Ondeaktivierung nicht (immer) aufgerufen wurde - irgendeine Idee, warum das sein könnte? – Bonnotbh
@Bonnotbh OnDeaktivierung und Entsorgung ist in Ninject normalerweise undefiniert. Ninject wird aufgeräumt, nachdem der Müll vom GC gesammelt wurde. Dies ist für Datenbankverbindungen oft nicht durchführbar. – Steven