2011-02-16 9 views
7

Volevo essere sicuro che structuremap disponga il mio DataContext dopo la richiesta.Structuremap Smaltimento dell'oggetto DataContext

Qui è la mia messa a punto

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

Will StructureMap auto smaltire il mio DataContext o devo chiamare Dispose manualmente ??

risposta

4

No, non lo disporrà automaticamente, a meno che non si utilizzino contenitori annidati e si disponga del contenitore che contiene l'istanza di contesto. Spetta al creatore del contesto di Smaltirlo. Il creatore di solito è la parte del codice chiamando ObjectContext.GetInstance<MyDataContext> o il metodo principale che rende StructureMap iniettare un DataContext in uno dei vostri oggetti.

Una pratica comune è creare un contesto per HttpRequest e disporre il contesto alla fine della richiesta.

+0

Grazie. Risposta accettata –

9

Questo è quello che faccio:

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

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

e ...

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

HybridHttpOrThreadLocalScoped utilizza il HttpContext quando disponibile.

StructureMap si occupa di tutto, allora. Basta ricordarsi di implementare IDisposable nelle classi.

+0

se in SM utilizzando HybridHttpOrThreadLocalScoped utilizzerà stoccaggio ThreadLocal, chiamando ReleaseAndDisposeAllHttpScopedObjects genera un'eccezione. Puoi dirmi come sei riuscito a disporre degli oggetti memorizzati in ThreadLocal? – Roman

+0

@Am: Non è possibile utilizzare HybridHttpOrThreadLocalScoped è membro di HttpContextLifecycle. Ho visto che ThreadLocalStorageLifecycle (che è quello che ti interessa) ha un metodo chiamato EjectAll. Non l'ho mai usato, pensato, e non mi sono mai interessato a questo. – LeftyX