MVC + EF4 + POCO - Как сохранить контекст сущности? - PullRequest
4 голосов
/ 13 ноября 2010

Я начинаю проект MVC, пройдя учебник по MvcMusicStore. Я пытаюсь понять, как сгенерированный POCO контекст данных / сущностей предназначен для хранения.

В примерах контроллер генерирует копию контекста сущности, и все операции там выполняются:

        MusicStoreEntities storeDB = new MusicStoreEntities();

        //
        // GET: /Store/

        public ActionResult Index()
        {
            // Retrieve list of Genres from database
            var genres = from genre in storeDB.Genres
                         select genre.Name;
            [...]

Если я хочу разделить свое решение на слои, какова стандартная практика (или ключевые варианты) для сохранения контекста? Сгенерировать ли я его в контроллере и передать в хранилище, или возможно ли в хранилище сохранить копию общего пользования?

Я понимаю, что вышеизложенное необходимо для использования шаблона Единица работы.

Мои слои:

  • Данные (файл edmx)
  • Сущности (генерируется из POCO)
  • Репозиторий
  • Mvc web app

Мои другие вопросы: - Каковы затраты на создание контекста? - Поскольку нет .Close (), и он не реализует IDisposable, стоит ли за ним ObjectContext, генерирующий отдельные соединения, пул соединений, разделяющий один экземпляр? - Можно ли заблокировать ObjectContext, если он слишком часто передается между слоями / операциями?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 13 ноября 2010

Я не хочу вдаваться в подробности / код здесь, поэтому я просто упомяну некоторые моменты:

  1. Ваш контроллер может работать с несколькими репозиториями
  2. Должно быть один репозиторий на суммарный корень
  3. Работа контроллера среди нескольких репозиториев стала возможной благодаря Единица работы
  4. Использование контейнера DI для управления жизненным циклом единицы работы (которая фактически является контекстом)
  5. Не используйте синглтоны для контекста, пусть контейнер DI создает / удаляет контекст за HTTP-запрос
2 голосов
/ 13 ноября 2010

Я создаю отдельный репозиторий для каждого контроллера и помещаю туда свой контекст.Правила, которые я соблюдаю, заключаются в том, что репозиторий обрабатывает все, что мне может понадобиться (не совсем определение репозитория, но оно работает для меня).Репозиторий может вызывать другие репозитории, если это необходимо, но контроллер не должен знать об этом.Контекст является свойством экземпляра репозитория и создается по требованию (я еще не сделал скачок в МОК).Если хранилище вызывает другое хранилище, оно передает экземпляр Context.

Это выглядит примерно так ...

public class MyController : Controller
{
    public IMyControllerRepository Repository { get; set; }
    public ActionResult MyAction(int id)
    {
        var model = Repository.GetMyModel(id);
        return View(model);
    }
}

public class MyControllerRepository : IMyControllerRepository
{
    public MyContext Context { get; set; };
    public MyModel GetMyModel(int id)
    {
        return (from m in Context.MyModels
                where m.ID = id
                select m).SingleOrDefault();
    }
}
...