2011-02-16 26 views
7

Quería estar seguro de si structuremap eliminará mi DataContext después de que termine la solicitud.Structuremap Eliminación del objeto DataContext

Aquí está mi configuración

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

Se StructureMap automático disponer mi DataContext o tengo que llamar a Dispose manualmente ??

Respuesta

4

No, no lo eliminará automáticamente, a menos que use contenedores anidados y elimine el contenedor que contiene la instancia de contexto. Depende del creador del contexto desecharlo. El creador suele ser la parte del código que llama al ObjectContext.GetInstance<MyDataContext> o el método raíz que hace que StructureMap inserte un DataContext en uno de sus objetos.

Una práctica común es crear un contexto por HttpRequest y disponer el contexto al final de la solicitud.

+0

Gracias. Respuesta aceptada –

9

Eso es lo que hago:

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

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

y ...

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

HybridHttpOrThreadLocalScoped utiliza el HttpContext cuando esté disponible.

StructureMap se ocupa de todo, entonces. Simplemente recuerde implementar IDisposable en sus clases.

+0

Aunque en SM el uso de HybridHttpOrThreadLocalScoped utilizará el almacenamiento ThreadLocal, llamando a ReleaseAndDisposeAllHttpScopedObjects arroja una excepción. ¿Puede decirme cómo ha logrado deshacerse de los objetos almacenados en ThreadLocal? – Roman

+0

@Am: no puede usar HybridHttpOrThreadLocalScoped es miembro de HttpContextLifecycle. He visto que ThreadLocalStorageLifecycle (que es el que le interesa) tiene un método llamado EjectAll. Nunca lo he usado, pensé, y nunca profundicé en esto. – LeftyX

Cuestiones relacionadas