2011-02-16 10 views
7

Chciałem mieć pewność, że structuremap wyrzuci mój DataContext po zakończeniu każdego żądania.Struktura obiektu Usuwanie obiektu DataContext

Oto moja konfiguracja

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

Will StructureMap auto wyrzucać moje datacontext czy trzeba zadzwonić Dispose ręcznie ??

Odpowiedz

4

Nie spowoduje, że nie zostanie automatycznie usunięty, chyba że użyjesz kontenerów zagnieżdżonych i usuniesz kontener zawierający instancję kontekstu. Odkrycie to zależy od twórcy kontekstu. Twórca zazwyczaj byłby częścią twojego kodu wywołującego ObjectContext.GetInstance<MyDataContext> lub metodą podstawową, która sprawia, że ​​StructureMap wstrzykuje Kontekst danych do jednego z twoich obiektów.

Powszechną praktyką jest tworzenie kontekstu na HttpRequest i usuwanie kontekstu na końcu żądania.

+0

Dziękuję. Odpowiedź została zaakceptowana. –

9

To, co robię:

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

i ...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScoped używa HttpContext kiedy będzie dostępny.

StructureMap zajmuje się wszystkim, a następnie. Pamiętaj tylko, aby zaimplementować IDisposable w swoich zajęciach.

+0

Chociaż w SM przy użyciu HybridHttpOrThreadLocalScoped będzie używać magazynu ThreadLocal, wywoływanie ReleaseAndDisposeAllHttpScopedObjects zgłasza wyjątek. Czy możesz mi powiedzieć, w jaki sposób udało ci się pozbyć obiektów przechowywanych w ThreadLocal? – Roman

+0

@ Am: Nie można użyć HybridHttpOrThreadLocalScoped jest członkiem HttpContextLifecycle. Widziałem, że ThreadLocalStorageLifecycle (który jest tym, który cię interesuje) ma metodę o nazwie EjectAll. Nigdy go nie używałam, nie myślałam i nigdy w to nie zaglądałam. – LeftyX

Powiązane problemy