Где мне создать экземпляр Unit of Work в приложении ASP.Net MVC 3?

Я прочитал столько сообщений на Stackoverflow, сколько смог найти относительно использования шаблона Unit of Work в приложение 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();
    }

Я читал другие, в которых говорилось, что экземпляр единицы работы не должен находиться в контроллере, а должен быть создан на уровне обслуживания вместо.Причина, по которой я не так уверен в этом подходе, заключается в том, что моему контроллеру, возможно, придется использовать несколько разных Уровни служб в одной бизнес-транзакции, и если бы экземпляр единицы работы был создан внутри каждой службы, это привело бы к нескольким Создаваемые экземпляры Единицы Работы, что противоречит цели, т. Е. Одна Единица Работы на бизнес-транзакцию.

Возможно, то, что я объяснил выше, неверно, но если это так, я был бы очень признателен, если бы кто-нибудь мог меня исправить.

Еще раз спасибо за вашу помощь.

12
задан gdoron is supporting Monica 2 February 2012 в 15:54
поделиться