MVC3 - EF4: один DbContext для всех репозиториев и моделей представления - UnitOfWork? - PullRequest
1 голос
/ 19 декабря 2011

Я полностью застрял.

  • У меня есть два контроллера: «Клиент» и «Адрес». Оба имеют поля CustomerRepository и AddressRepository.

  • Существует две модели представления: CustomerViewModel и AddressViewModel. У них также есть поля CustomerRepository и AddressRepository. (А также конструктор без параметров, поскольку они являются параметрами в методах редактирования и создания)

  • В самих репозиториях есть объект DbContext из моих сущностей.

Теперь я сталкиваюсь с одной проблемой за другой. Я думаю, что я должен иметь только ОДИН DbContext, чтобы поделиться со всеми моими классами (Репозитории И ViewModels) И я думаю, что UnitOfWork - это решение. Но я понятия не имею, как это использовать.

В настоящее время я пытался создать DbContext в конструкторе контроллеров и передать его каждому объекту, который в этом нуждается. Но даже это не работает.

Если код необходим, я его опубликую.

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

Несколько вещей, которые нужно знать:

1. Единица работы

Единица работы не обязательно является своего рода реализацией для IUnitOfWork. Это просто шаблон, который можно применять разными способами. Во-первых, и прежде всего - вы должны понять, для чего это нужно, прежде чем на самом деле его использовать, и слишком усложнять все вокруг. Более того, DbContext API EF Code-First DbContext является своего рода шаблоном Unit of Work. Ваши IDbSet<> являются вашими хранилищами. Не пытайтесь абстрагироваться от своего ORM, начните с самой простой вещи.

2. Инъекция DbContext

Для начала просто вставьте DbContext в ваш контроллер с помощью инжектора конструктора. Не забудьте настроить контейнер IoC и подключить MVC DependencyResolver. Ваш контроллер может выглядеть так (пример также содержит пример использования AutoMapper, см. Следующий пункт о ViewModels для этого):

public CustomerController : Controller
{
    public CustomerController(MyDbContext data, IMappingEngine mapper)
    {
        Data = data;
        Mapper = mapper;
    }

    public MyDbContext Data { get; set; }

    public IMappingEngine Mapper { get; set; }

    // Other controller code
}

3. Просмотр моделей

Это, опять же, шаблон, который так легко реализовать - просто наберите CustomerViewModel и используйте AutoMapper , чтобы легко преобразовать ваш Customer в CustomerViewModel, чтобы вы могли сделать это следующим образом :

public ActionResult Details(int id)
{
    var customer = Data.Customers.FirstOrDefault(c => c.Id == id);

    if (customer == null)
        return new HttpNotFoundResult();

    return View(Mapper.Map<CustomerViewModel>(customer));
}

Вы можете опросить веб-сайт AutoMapper о том, как подключить его и запустить. Обратите внимание, что вы не получаете ViewModel напрямую от DbContext. Вместо этого вы получаете «сущность», которая затем преобразуется в соответствующую модель представления.

Надеюсь, это поможет!

2 голосов
/ 19 декабря 2011

Ваши ViewModels не должны иметь ссылок на DbContext или репозитории.ViewModels должен быть в значительной степени глупым.Задачей контроллера (или службы, вызываемой контроллером) является заполнение ViewModels данными, необходимыми View.

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

0 голосов
/ 20 декабря 2011

В настоящее время я делаю следующее: один IUnitOfWork внедряет, используя единство для внедрения в мои контроллеры.

IUnitOfWork реализует IContext.

IContext содержит клиентов IDbSet и IDbSet Конкретная реализация IContext реализует DbContext.

Мои контроллеры ссылаются на сервис, сервис использует IUnitOfWork.Если вы используете репозиторий, то просто используйте один IContext, внедренный в ваш контроллер (или IUnitOfWork, который довольно легко добавить сверху)

Таким образом, у меня один контекст на время жизни запроса, и затем он удаляется.Если вы хотите больше кода, дайте мне знать, я посмотрю, что я могу опубликовать здесь.

...