Я прочитал столько сообщений в Stackoverflow, сколько смог найти, в отношении использования шаблона единицы работы в приложении ASP.Net MVC 3, которое включает бизнес-уровень. Тем не менее, у меня все еще есть пара вопросов по этой теме, и я был бы очень признателен за любые отзывы, которые люди могут мне дать.
Я разрабатываю веб-приложение ASP.Net MVC 3, которое использует EF 4.1. В этом проекте я буду использовать как репозиторий, так и шаблоны единиц работы, подобно тому, как они используются в это отличное руководство
Разница в моем проекте заключается в том, что мне нужно также включить бизнес-уровень (отдельный проект в моем решении), чтобы выполнять различные бизнес-правила для приложения. Упомянутый выше учебник не имеет бизнес-уровня и поэтому создает экземпляр класса Unit of Work из контроллера.
public class CourseController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
Однако мой вопрос: где мне создать экземпляр класса Unit of Work, если у меня есть бизнес-уровень?
Лично я считаю, что его следует создать в моем контроллере, а затем внедрить в бизнес-уровень следующим образом:
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();
}
Я читал, что другие говорят, что экземпляр единицы работы не должен быть в контроллере, а вместо этого должен создаваться на уровне обслуживания. Причина, по которой я не уверен в этом подходе, заключается в том, что моему контроллеру, возможно, придется использовать несколько разных уровней обслуживания в одной бизнес-транзакции, и если экземпляр единицы работы был создан внутри каждой службы, это приведет к нескольким экземплярам единицы работы. создается, что противоречит цели, т. е. одной Единице Работы на бизнес-транзакцию.
Возможно, то, что я объяснил выше, неверно, но если это так, я был бы очень признателен, если бы кто-нибудь меня поправил.
В очередной раз благодарим за помощь.