2009-11-10 7 views
9

Jest to bardzo podstawowe pytanie podczas korzystania z NHibernate w aplikacji internetowej, ale nie widzę uzgodnionej najlepszej praktyki podczas wyszukiwania w Internecie. Widziałem, jak to robiono w wielu różnych miejscach:Gdzie można otwierać i zamykać ISiA NHibernate w aplikacji internetowej (konkretnie MVC)?

Utworzony i usunięty w metodzie Repozytorium - Wydaje mi się to głupie, ponieważ kiedy dostaniesz obiekt, jest on już odłączony.

Na początku i na końcu kontrolera Działanie - Wydaje się, że jest to lepsze, ale denerwujące, aby to zrobić dla każdej czynności.

na poziomie aplikacji, w global.asax beginrequest i endrequest - To wydaje się najlepszy pomysł, ale ponownie, widziałem kilka przykładów tworzenia w Init zamiast beginrequest (ostry architektury na przykład) - chociaż jestem nie pewny dlaczego.

Być może istnieją inne podejścia?
Czy pojemniki IoC mogą w jakiś sposób pomóc?
Może znasz dobry zasób w sieci w związku z tym?
I jakiej metody używasz?

Dzięki

+0

Sharp Architecture wyjaśnia, dlaczego - jest to coś z IIS7, o ile pamiętam. – queen3

+0

W komentarzach do kodu mówi: "Z powodu problemów na IIS7, inicjalizacja NHibernate musi wystąpić w Init().", Ale nie wiem, jakie są problemy. – UpTheCreek

Odpowiedz

0

Widziałem kilka przykładów tworzenia w Init zamiast beginrequest (na przykład ostrej architektury) - chociaż nie jestem pewien dlaczego.

W IIS 7 Możesz mieć dostęp do stanu sesji w zdarzeniu Init Global.asax. Właśnie dlatego ostry łuk używa beginrequest.

Jeśli chodzi o zarządzanie sesjami, zgadzam się z Państwem - Global.asax jest najlepszym miejscem na to. Wydarzenie, jeśli chcesz mieć czyste oddzielenie między warstwami i usunąć ustawienia DAL z interfejsu użytkownika, możesz użyć do tego celu HttpModule.

Możesz również rzucić okiem na ayende's blog. Wyjaśnia on sposób zarządzania sesją:

+0

Cześć Sly, ale dlaczego musisz używać stanu sesji ASP.NET? A dlaczego nie po prostu umieścić go w Application_Start? – UpTheCreek

+0

Potrzebny jest stan sesji do przechowywania ISession NHibernate. Nie możesz tego zrobić w Application_Start, ponieważ nie możesz uzyskać dostępu do ApplicationState- i potrzebujesz go do umieszczenia SessionFactory w nim – Sly

+0

Większość rozwiązań, na które patrzyłem, nie używa stanu sesji, a raczej HttpContext.Items lub statycznego członka. – UpTheCreek

Powiązane problemy