Какой шаблон проектирования предпочтителен при работе с ASP.Net MVC и Entity Framework? - PullRequest
1 голос
/ 26 октября 2009

Я не совсем уверен, какой шаблон проектирования наиболее эффективно использовать при работе с ASP.Net MVC и Entity Framework, поэтому любые рекомендации очень ценятся!

Вы бы сохранили контекст в классе Controller или лучше создать репозиторий?

Если вы порекомендуете дизайн репо, нужно ли инициализировать контекст в каждом методе, как это? Или это лучший способ сделать это?:

public SomeEntity GetEntity(Guid id) {
   using(Context ctx = new Context()) {
      // code here...
   }
}

Ответы [ 3 ]

3 голосов
/ 26 октября 2009

Я использую шаблон Repository. Контекст находится в репозитории и действует столько же, сколько и репозиторий. Репозиторий инициализируется в Controller.Initialize и располагается в Controller.Dispose. Это означает, что один запрос получает репозиторий / контекст до его завершения, что работает очень хорошо - запросы короткие, поэтому контекст быстро удаляется. Но когда действие вызывает несколько методов репозитория, они все используют один и тот же контекст, что облегчает многие вещи.

0 голосов
/ 26 октября 2009

Я создал собственный класс репозитория с интерфейсом:

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);
    //Creates from detached item
    T Create(T item);
    //Updates from detached item
    //Attached item can be change directly and using SaveChanges
    T Edit(T item);
    void Delete(int id);
    void DeleteObject(object item);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}

Он заботится об основной операции CRUD, имеет также контекст. Над хранилищем у меня есть классы обслуживания, которые содержат бизнес-логин. Пример:

public interface IProjectService
{
    IQueryable<Project> ListProjects();
    Project GetProjectByName(string name);
    Project GetProjectByID(int id);
    bool EditBasicProjectData(Project project);
    bool CreateProject(Project project);
    bool DeleteProject(int id);
    void SetCurrentProjectByID(int id);
}

Каждый сервис имеет необходимые репозитории. Контроллеры имеют сервисы, введенные NInject. Методы контроллера короткие, они только передают данные из сервисов для просмотра (в обоих направлениях). Это делает весь проект легко тестируемым. Вы можете смоделировать хранилище для тестирования сервиса. Вы можете смоделировать сервис для проверки контроллера.

0 голосов
/ 26 октября 2009

Шаблон репозитория - это путь

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

Открыть контекст как можно позже и закрыть как можно скорее
Подобно соединениям, вы также должны выпустить свой контекст как можно быстрее, поэтому сделайте любую дополнительную обработку перед тем, как фактически читать / фиксировать в БД через EF. Так. Используйте ваши блоки как можно короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...