Вопрос

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

EF Code First - LINQ TO ORTIONS UNIONE EVATITYCOMPRERER

Ответ был связан с тем, что я использовал два разница в моем 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();

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

Это было полезно?

Решение

Потому что, когда каждый репозиторий построен, Ninject Will предоставляет вам новый экземпляр 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;
         }    
}

Другие советы

Чтобы улучшить решение Feanz, я все еще сделал бы впрыск имущества инъекции иннета с Ninject:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top