1

Ich bin neu in IoC und NHibernate und habe große Schwierigkeiten, versucht zu haben, Best Practices für Dependency-Injection kennenzulernen. Ich habe die letzten Tage damit verbracht, mich umzusehen und die Dokumentation zu lesen, aber leider ist die Dokumentation, die ich gefunden habe, entweder veraltet oder unvollständig.Wie man NHibernate-Sitzungen pro Anfrage in Structuremap.MVC5 verwaltet

Zum Beispiel sagt mir das, was ich tun soll, aber ich habe keine Ahnung, wie es geht. XSockets.Net - how to manage NHibernate Session Context

Ich habe gelernt, dass nach den official documentation, ich brauche verschachtelte Container zu verwenden, in StructureMap, um sicherzustellen, dass die Sitzungen erstellt werden und entsprechend für jede Anforderung angeordnet ist. Leider werden die Beispiele alle in Komponententests festgelegt, die ihren eigenen Container erstellen. Ich habe keine Ahnung, wie man das auf MVC anwendet.

Wenn ich ein Repository wie diese

public class Repository : IRepository {  
    public Repository(ISession session) { 
     ... 
    } 
    ... 
} 

Wie mache ich diese Arbeit:

public NHibernateRegistry()  
{ 
    ISessionFactory factory = config.BuildSessionFactory(); 
    For<IRepository>.Use<Repository>() 
    For<ISession>.???????? 
} 

Oder habe ich alles nach hinten irgendwie bekam?

+0

Hier ist ein Blog-Beitrag beschreibt es für andere Injektion Framework, aber es sollte nützlich sein http://slynetblog.blogspot.com/2012/03/using-aspnet-mvc-4-webapi-with.html – Sly

+0

Hallo Sly , Danke für den Link. Die Zeile 'builder.Register (x => x.Resolve (). OpenSession()). InstancePerHttpRequest();' ist das Ding, von dem ich weiß, dass ich es ausführen möchte, aber nicht herausfinden kann, wie es in structuremap übersetzt werden soll . – mike1952

Antwort

0

Also, es stellt sich heraus, dass dieses Verhalten automatisch ist - ich muss es nicht einschalten. Ich machte einen unverwandten Fehler und dachte, dass dies das Problem sei. Eine etwas unklare Dokumentation hilft nicht. Wenn Sie das structuremap.MVC5 nuget Paket dann verwenden:

SessionFactory _factory; 
public NHibernateRegistry()  
{ 
    _factory = config.BuildSessionFactory(); 
    For<IRepository>.Use<Repository>() 
    For<ISession>.Use(() => _factory.OpenSession()); 
} 

Diese StructureMap verursacht pro Httprequest eine Sitzung einmal zu öffnen. Natürlich sollten Sie die Sitzung hier nicht öffnen, da es eine Reihe von Dingen in Bezug auf Transaktionen, Bindungen und Arbeitseinheiten gibt, mit denen Sie richtig umgehen möchten - aber das ist eine separate NHibernate-Sache, die den Rahmen sprengt dieses Problem.

Verwandte Themen