He leído tantas publicaciones sobre Stackoverflow como puedo encontrar con respecto al uso de un patrón de unidad de trabajo dentro de una aplicación ASP.Net MVC 3 que incluye una capa comercial. Sin embargo, todavía tengo un par de preguntas con con respecto a este tema y agradecería mucho cualquier comentario que la gente pueda darme.¿Dónde debería crear la instancia de unidad de trabajo en una aplicación ASP.Net MVC 3?
Estoy desarrollando una aplicación web ASP.Net MVC 3 que utiliza EF 4.1. Me va a utilizar tanto en el repositorio y Unidad de Patrones de Trabajo con este proyecto similar a la forma en que se utilizan en this gran tutorial
La diferencia en mi proyecto es que necesito para incluir también una capa empresarial (proyecto separado en mi solución) con el fin de llevar a cabo las diversas reglas de negocio para la aplicación. El tutorial se mencionó anteriormente no tiene una capa de negocios, y por lo tanto, crea una instancia de la Unidad de Trabajo de clase del controlador
public class CourseController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
Sin embargo, mi pregunta es, ¿dónde debería crear la instancia de la unidad de trabajo clase si tengo una Business Layer?
yo personalmente creo que debería ser creado en mi controlador y luego se inyecta en la capa de negocio de esta manera:
public class PeopleController : Controller
{
private readonly IUnitOfWork _UoW;
private IPersonService _personService;
public PeopleController()
{
_UoW = new UnitOfWork();
_personService = new PersonService(_UoW);
}
public PeopleController(IUnitOfWork UoW, IPersonService personService)
{
_UoW = UoW;
_personService = personService;
}
public ActionResult Edit(int id)
{
Person person = _personService.Edit(id);
return View(person);
}
public class UnitOfWork : IUnitOfWork, IDisposable
{
private BlogEntities _context = new BlogEntities();
private PersonRepository personRepository = null;
public IPersonRepository PersonRepository
{
get
{
if (this.personRepository == null)
{
this.personRepository = new PersonRepository(_context);
}
return personRepository;
}
}
public void Save()
{
_context.SaveChanges();
}
public class PersonService : IPersonService
{
private readonly IUnitOfWork _UoW;
public PersonService(IUnitOfWork UoW)
{
_UoW = UoW;
}
public Person Edit(int id)
{
Person person = _UoW.PersonRepository.GetPersonByID(id);
return person;
}
public class PersonRepository : IPersonRepository
{
private readonly BlogEntities _context;
public PersonRepository(BlogEntities context)
{
_context = context;
}
public Person GetPersonByID(int ID)
{
return _context.People.Where(p => p.ID == ID).Single();
}
He leído otros diciendo que la Unidad de instanciación El trabajo no debe estar en el controlador, pero creado en Service Layer en su lugar. La razón por la que no estoy tan seguro acerca de este enfoque es porque mi controlador puede tener que usar varias capas de servicio en una transacción comercial, y si la instancia de unidad de trabajo se creó dentro de cada servicio, resultaría en varias unidades de Se crean instancias de trabajo que anulan el objetivo, es decir, una unidad de trabajo por transacción comercial.
Tal vez lo que he explicado anteriormente es incorrecto, pero si es así, agradecería mucho si alguien pudiera corregirme.
Gracias de nuevo por su ayuda.
Gracias por esto Steve. Actualmente, nunca he usado o implementado un contenedor DI, aunque definitivamente no estoy descartando. Sin embargo, para esta aplicación que estoy construyendo, si elijo no implementar un contenedor DI y me quedé con DI manual, ¿estaría bien utilizar el código que he mencionado en mi pregunta (en particular, inyectar la UoW en el Servicio)? – tgriffiths
Sin duda puede conectar todo manualmente; en ese caso, debe usar la segunda opción de crear un objeto que utiliza 'HttpContext.Current.Items' para almacenar su objeto Entidades según cada solicitud. Ya sea que uses un contenedor o no, aún diría que el 'UnitOfWork' debería ir a la capa de servicio; He actualizado mi respuesta para aclarar esto un poco :) –
Gracias de nuevo Steve, ¡aunque parece que estoy cada vez más confundido! Usted dice que necesitaré crear un objeto que use HttpContext.Current.Items para almacenar mis Entidades según cada solicitud, pero mi ObjectContext almacenará/administrará mis Entidades y se creará dentro de mi Unidad de La clase de trabajo y la UoW solo existirán por solicitud HTTP. – tgriffiths