EF DbContext и Ninject - PullRequest
       10

EF DbContext и Ninject

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

Некоторое время назад я задал вопрос о том, почему компаратор равенства по умолчанию не работал, когда я объединял две коллекции сущностей.

EF Code First - Linq to Entity Union EqualityComparer

Ответ был из-за того, что я использовал два разных экземпляра моего DbContext, следовательно, разные ссылки.

Так что теперь я пытаюсь разделить мой DbContent по запросу.Я вижу несколько «сложных» примеров, но я подумал, что попробую более простое решение.

Поэтому я создал интерфейс IDbContext, который просто описывает мои сущности

public interface IDbContext {
   int SaveChanges();
   DbSet<News> News { get; set; }
   DbSet<Category> Categories { get; set; }
}

Мой DbContext - этозатем реализовать так:

public class SiteContext : DbContext, IDbContext {
   public DbSet<News> News { get; set; }
   public DbSet<Category> Categories { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      ...
   }
}

Затем в двух моих репозиториях (NewsRepository и CategoryRespository) у меня есть IDbContext в качестве параметра конструктора

IDbContext _db;

public NewsRepository(IDbContext db) {
    _db = db;
}

Так что теперь я предполагаю, что если я связываю IDbContextк SiteContext в области запроса, мои репозитории будут использовать один и тот же контекст?

 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();

Однако, когда я снова пытаюсь выполнить объединение из предыдущего вопроса, я все равно получаю дубликаты сущностей!Что я делаю не так?Как я могу определить, использую ли я один и тот же контекст в одном запросе?

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Потому что, когда каждый репозиторий создается, Ninject будет предоставлять вам новый экземпляр SiteContext для каждого репозитория. Вот почему его не работает. Хорошая идея - использовать реализацию unitofwork, что означает, что все репозитории используют один и тот же контекст.
UnitOfWork будет принимать IDbContext на строительство.

Что-то вроде этого будет работать

private IDbContext _context;

public UnitOfWork(IDbContext context)
{
    _context = context
}

private _INewsRepository;
public INewsRepoitory 
{
    get{
         if(_INewsRepository == null)
         {
              _INewsRepository = new NewsREpository(_context);
              return _INewsRepository;
         }
         else
         {
              return _INewsRepository;
         }    
}
0 голосов
/ 13 февраля 2013

Чтобы улучшить решение feanz, я по-прежнему выполняю внедрение свойства INewsRepository с помощью Ninject:

[Inject]
public INewsRepository NewsRepo {get;set;}

Каждый раз, когда создается IUnitOfWork, создается также INewsRepository.Это все еще должно быть добавлено к вашим привязкам.

...