EF Context Management - PullRequest
       2

EF Context Management

7 голосов
/ 05 марта 2011

Каков наилучший способ управления контекстом Entity Framework при использовании приложения MVC?

Я использую шаблон Repository / Service.

Редактировать

После просмотра некоторых из этих вопросов: stackoverflow.com/users/587920/sam-striano, я запутался больше, чем раньше.Некоторые говорят, что используют контекст для репозитория, но если я хочу использовать несколько репозиториев в одном методе контроллера?

И чтобы следовать хорошему дизайну разделения, как использовать UnitOfWork в приложении MVC, не делая его зависимым отEF?Я хочу иметь возможность модульного тестирования моих контроллеров, моделей, сервисов и т. Д. С использованием фиктивного контекста?

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

Использование структуры инжектора зависимостей / инверсии управления, например:

  1. Ninject
  2. Autofac
  3. StructureMap
  4. Unity

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

Вот хорошая статья о настройкевверх Ninject.

Как скорее всего будет выглядеть ваш код, при условии, что вы используете универсальный репозиторий:

Ninject Module:

public class NinjectRegistrationModule : NinjectModule
{
    public override void Load()
    {
        Bind<MyDataContext>().ToSelf().InRequestScope();
        Bind(typeof(RepositoryImplementation<>)).ToSelf().InRequestScope();

    }
}

Общий репозиторий:

public RepositoryImplementation<T> : IRepository<T> where T : class
{
    MyDataContext _dataContext;

    public RepositoryImplementation<T>(MyDataContext dataContext)
    {
        _dataContext = dataContext;
    }

    // bunch of methods that utilize _dataContext
}

Класс обслуживания:

public class MyServiceClass
{
    IRepository<SomeEntity> _someEntityRepository;

    public MyServiceClass(IRepository<SomeEntity> someEntityRepository)
    {
        _someEntityRepository = someEntityRepository;
    }

    // do stuff with _someEntityRepository = someEntityRepository;
}

Контроллер:

public class MyController
{
    MyServiceClass _myServiceClass;

    public MyController(MyServiceClass myServiceClass)
    {
        // Ninject will auto-magically give us a myServiceClass
        // which will Ninject will inject a repository into MyServiceClass's constructor
        _myServiceClass = myServiceClass;
    }

    public ActionResult MyAction()
    {
        // use _myServiceClass to do stuff
        return View();
    }
}
0 голосов
/ 05 марта 2011

Если ваша функциональность проста, то вы должны создать новый ObjectContext в каждом репозитории. Их дешево создавать.

Если это создает конфликт, вы можете использовать шаблон «Единица работы», как было предложено в комментарии.

Я бы посоветовал вам быть крайне осторожным при интеграции ObjectContext или DataContext с DI-контейнером. Многие по умолчанию не используют соответствующую область для своего жизненного цикла.

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