Entity Framework 4.1 Code First - Правильный способ обмена dbContext между репозиториями? - PullRequest
4 голосов
/ 19 июня 2011

Я сталкиваюсь с проблемами в нескольких контекстах, и основное решение, которое возникает, - это разделять контекст между репозиториями, однако я не нашел хорошего примера того, как это сделать.

Для справки,Я использую веб-приложение MVC для подключения к своему уровню данных.Я хотел бы иметь один контекст для запроса пользователя (при условии, что это правильно).

Спасибо,

Изменить -

Это мое решение с помощью ссылок BrokenGlassи следующий SO Вопрос :

Я, по сути, реализовал шаблон единиц работы и внедрение зависимостей.Я должен был упомянуть в дополнение к использованию MVC, я также использую Ninject.

В данном конструкторе хранилища (подробности шаблона единицы работы см. Ниже):

public class PersonRepository : IPersonRepository
{
    private readonly MyContext _context;

    public PersonRepository(IUnitOfWork unitOfWork) 
    {
        if (unitOfWork == null)
            throw new ArgumentNullException("unitOfWork");

        _context = unitOfWork as MyContext;
    } 

    //...
}

В моем приложении MVC в классе NinjectMVC3 (ключом является метод InRequestScope ()):

private static void RegisterServices(IKernel kernel)
{
     kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope();
     kernel.Bind<IPersonRepository>().To<PersonRepository>();
     //...
}  

Ответы [ 2 ]

4 голосов
/ 19 июня 2011

Ваш уровень хранилища должен предоставить единицу работы , которая представляет один запрос и использует объект контекста, который затем используется во всех отдельных хранилищах, необходимых для выполнения запроса.

В частности, для HTTP / веб-приложений вы можете кэшировать контекст БД в HttpContext.Current.Items, в котором хранятся общие данные для каждого HTTP-запроса. Также проверьте этот аналогичный поток SO для деталей: присоединение linq к sql datacontext к httpcontext на бизнес-уровне

0 голосов
/ 20 июня 2011

Мой ответ на C # / EF и шаблон репозитория: где поместить ObjectContext в решение с несколькими репозиториями? обеспечивает реализацию RepositoryProvider, которая работает с одним экземпляром ObjectContext. Вы можете использовать код таким же образом, с LINQ-to-SQL DataContext вместо EF ObjectContext. Преимущество RepositoryProvider по сравнению с Ninject состоит в том, что реализация RepositoryProvider не привязана к конкретной структуре DI и может сама настраиваться в любой структуре DI.

Кроме того, вы можете управлять созданием и областью действия DataContext для потока или веб-запроса (например, в ответе @ BrokenGlass с HttpContext.Current.Items), используя класс DataContextFactory из здесь .

...