Совместное использование контекста данных всеми моими репозиториями с использованием Entity Framework - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть решение MVC3, где у меня есть 2 хранилища и 2 уровня обслуживания. У меня также есть отдельный каждый слой: controller <-> service <-> хранилище

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

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

public class EntityFrameworkDbContext: DbContext, IUnitOfWork
{
    public DbSet<Project>           Projects            { get; set; }
    public DbSet<Technology>        Technologies        { get; set; }

    public void Save()
    {
        SaveChanges();
    }
}

public interface IUnitOfWork
{
    void Save();
}

Привязки nInject

ninjectKernel.Bind<IUnitOfWork>().To<EntityFrameworkDbContext>().InRequestScope();
ninjectKernel.Bind<IMainRepository>().To<MainRepository>();
ninjectKernel.Bind<IAdminRepository>().To<AdminRepository>();
ninjectKernel.Bind<IMainService>().To<MainService>();
ninjectKernel.Bind<IAdminService>().To<AdminService>();

Контроллер

public class AdminController : Controller
{
    private IMainService m_MainService;
    private IAdminService m_AdminService;

    public AdminController(IMainService mainService, IAdminService adminService)
    {
        m_MainService = mainService;
        m_AdminService = adminService;
    }
    ...
}

Услуги

public class MainService : IMainService
{
    private IMainRepository m_Repository;

    public MainService(IMainRepository repository)
    {
        m_Repository = repository;
    }
    ...
}

Репозиторий

public class AdminRepository : IAdminRepository 
{
    private EntityFrameworkDbContext m_Context;

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

        m_Context = unitOfWork as EntityFrameworkDbContext;
    }
    ...
}

Как видите, я реализую шаблон «Единица работы», но не знаю, насколько это хороший подход.

Спасибо.

1 Ответ

1 голос
/ 27 ноября 2011

Использовал аналогичный подход с MVC3 и Linq2SQL, поэтому я думаю, это должно работать и для Entity Framework.Просто убедитесь, что вы сообщаете факт другим разработчикам, что по умолчанию все запросы в одном и том же запросе используют один и тот же EF DbContext, если не указано иное.

Одно замечание: вы фактически приводите свой IUnitOfWork кEntityFrameworkDbContext введите свой репозиторий, и я думаю, вы не могли просто заменить его другой реализацией.Является ли хорошей идеей опубликовать для вызывающих абонентов, что вы ожидаете IUnitOfWork (у которого есть 1 метод), но под капотом ваш код работает, только если вы передаете EntityFrameworkDbContext?И я думаю, что код потерпит неудачу, если параметр не является действительным EntityFrameworkDbContext?

. Если вы используете этот фактический текст данных EF, вы можете передать фактический EntityFrameworkDbContext экземпляр всем вызывающим абонентам, использующим Ninject, как этот:

//this makes sure all contexts use the same DbContext
ninjectKernel.Bind<EntityFrameworkDbContext>().To<EntityFrameworkDbContext>().InRequestScope();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...