Ich verwende StructureMap als meinen IoC-Container und NHibernate als meinen ORM. Ich habe online ein Beispiel gefunden, das zeigt, wie StructureMap die ISessionFactory und die ISession erstellt, so dass die Factory ein Singleton ist und die Session auf dem HttpContext basiert. Das funktioniert prima, aber dann habe ich den NH Profiler verwendet, der mir sagte, dass ich immer explizit Transaktionen verwenden sollte. Also dachte ich mir, warum sollte StructureMap das nicht auch für mich erledigen? Mit dem unten stehenden Code habe ich das alles gut hinbekommen, nur weiß ich nicht, wie/wo ich meine Transaktion festschreiben/zurücknehmen soll.
So initialisiere ich StructureMap:
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<ISessionFactory>()
.CacheBy(InstanceScope.Singleton)
.TheDefault.Is.ConstructedBy(cfg.BuildSessionFactory);
x.ForRequestedType<ISession>()
.CacheBy(InstanceScope.Hybrid)
.TheDefault.Is.ConstructedBy(context => context.GetInstance<ISessionFactory>().OpenSession());
x.ForRequestedType<ITransaction>()
.CacheBy(InstanceScope.Hybrid)
.TheDefault.Is.ConstructedBy(context => context.GetInstance<ISession>().BeginTransaction());
x.Scan(y =>
{
y.TheCallingAssembly();
y.WithDefaultConventions();
});
});
Alle meine Repositories sehen wie folgt aus:
public UserRepository(ISession session, ITransaction transaction)
{
_session = session;
_transaction = transaction;
}
Und eine typische Methode innerhalb eines Repositorys sieht so aus:
public void Remove(int id)
{
Remove(_session.Get<User>(id));
}
Was ich versuche zu tun ist, haben alle Methoden, die ich in einem HttpContext aufrufen, teilen die gleiche Sitzung und Transaktion. Ist dies möglich oder ist dies völlig falsch und ich bin barking up the wrong tree?
Vielen Dank im Voraus!
-Dan