5

Recientemente comencé a profundizar en el concepto de Repository Patterns y UnitOfWork junto con la exploración de EntityFramework.EF, UoW y repositorio: ¿cuándo disponer el UnitOfWork en WebForms?

hizo que mi propia aplicación basada en un ejemplo MVC, donde fueron disponer el UnitOfWork desde el controlador de esta manera:

protected override void Dispose(bool disposing) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(disposing); 
} 

No estoy en MVC en absoluto, y bastante nuevo en formularios web, así, pero supongo que están anulando el método de disposición del controlador para disponer el UnitOfWork ya que "todo" está dispuesto.

Básicamente me gustaría implementar el mismo concepto en mi sitio web ASP.NET WebForms y deshacerme del UnitOfWork que se utiliza detrás del código de una página junto con la eliminación de la página en sí.

Consideré agregar lo mismo al Página_Unload evento del ciclo de vida, pero no estaba seguro de si esta es la manera correcta de hacerlo, ya que no me he equivocado con tales cosas antes. Mi idea de la siguiente manera:

protected void Page_Unload(object sender, EventArgs e) 
{ 
    unitOfWork.Dispose(); 
    base.Dispose(); 
} 

¿Cómo puedo lograr que con seguridad, y estoy en el camino correcto?

+0

Posible duplicado de: http://stackoverflow.com/questions/2750111/when-to-call-dispose-in-entity-framework http://stackoverflow.com/questions/4295975/repository-pattern-in- entity-framework-4-when-should-we-dispose http://stackoverflow.com/questions/10777630/questions-about-entity-framework-context-lifetime http://stackoverflow.com/questions/1698628/entity- framework-and-object-context-lifetime-in-asp-net-mvc –

+0

Gracias por señalarlos, probablemente sean útiles para alguien con un conocimiento más profundo que solo necesita un poco de información para implementar lo que quiere. Yo no por desgracia. – Peter

+0

En realidad, lo fueron para que usted y otros puedan verificar si la pregunta es la misma y, de ser así, cierre esta pregunta. ¿No te ayuda ninguna de las respuestas a alguna de las preguntas? –

Respuesta

4

Antes que nada: no invente la rueda.

Uso inyección de dependencias marcos como: StructureMap, Ninject, Unidad, etc ....

Su UoW debe iniciarse con una petición de principio web y dispuestos cuando el solicitud ha finalizado.

En otras palabras,: DataContext of EF debe inicializarse cuando se inicia una solicitud. Luego puede almacenarlo en alguna parte (Session, ...) y puede reutilizarse para esa solicitud. Una instancia de DataContext por solicitud.

Pero si intenta hacerlo usted mismo, está en el camino equivocado, utilizando un marco de inyección de dependencias, lo haría tan fácil.

El marco puede manejar vida de su DataContext (UoW).

+0

Gracias por la respuesta, estoy investigando los marcos de Inyección de Dependencia que son completamente desconocidos para mí en este momento. Dejaré esto abierto un poco más hasta que termine de investigar, tal vez alguien tenga algo que agregar. – Peter

+0

Claro. Como realmente me gustan estos temas, me gustaría escuchar de otros sobre estos asuntos. –

+0

De acuerdo, comencé con Initializing the UnitOfWork. Observé que el evento BeginRequest se activa también para todos los archivos estáticos, lo que provoca una inicialización repetitiva e innecesaria de la UoW. ¿Podría un Marco DI resolver este problema para mí (Webforms)? ¿Y cuál sería otra solución alternativa? – Peter

2

Usted debe dividir su software en capas y componentes ...

interfaz de usuario -> Controlador -> Servicio -> DAL

P. ej

UI.Submit -> Controller.SaveUserInfo -> UsersManagementService.SaveUserInfo ->

public void SaveUserInfo(User user) 
{ 
    using (var uow = new Uow()) 
    { 
     var dbUser = uow.Users.GetByKey(user.Id); 
     if (dbUser == null) 
     { 
      // TODO: 
     } 

     dbUser.Name = user.Name; 
     dbUser.Address = user.Address; 
     // Or use a framework for injecting properties 

     uow.SaveAndAcceptChanges(); 
    } 
} 

Puede incluso recibir lógica de consulta en los métodos de servicio, por ejemplo certiain

public User GetUsersMatching(Func<IQueryable<User>, IQueryable<User>> query) 
{ 
    using (var uow = new Uow()) 
    { 
     var users = query(uow.Users).ToList(); 
     return users; 

     // For this to work using POCOs you may need to disable proxy creation 
    } 
} 

Sin embargo, esto hace que la prueba más compleja y requiere que los consumidores de servicio a entender las limitaciones y las mejores prácticas de LINQ a Entidades.

También se recomienda utilizar el patrón puramente académica repositorio-per-tipo base, tan a menudo a eficiente consumir diferentes tipos de datos de el mismo dominio requieren transversales consultas "depósito" y requieren join cláusulas en su LINQ o que el resultado de múltiples consultas se combinan y se modifican antes de devolverlo como un resultado limpio.

En lugar de tratar sus servicios como dominio-speicifc-repositories donde puede obtener varios tipos de resultados. O en otras palabras, use SOA bajo su MVC y por encima de su EF.

Cuestiones relacionadas