2

Я использую DbContextScope описал hereDbContextScope с Generic Repository

В своем примере, как ухватить в DbContext вне класса ее экземпляр, Мехди пишет:

public class UserRepository : IUserRepository { 
    private readonly IAmbientDbContextLocator _contextLocator; 

    public UserRepository(IAmbientDbContextLocator contextLocator) 
    { 
     if (contextLocator == null) throw new ArgumentNullException("contextLocator"); 
     _contextLocator = contextLocator; 
    } 

    public User Get(Guid id) 
    { 
     return _contextLocator.Get<MyDbContext>.Set<User>().Find(id); 
    } 
} 

Но, если им будет для общего хранилища, скажем

public abstract class RepositoryBase<T> : IRepository<T> where T : class, IDomainEntity 
{ 
    private readonly DbSet<T> set; 

    private IAmbientDbContextLocator contextLocator; 

    protected RepositoryBase(IAmbientDbContextLocator ctxLocator) 
    { 
     if (ctxLocator == null) throw new ArgumentNullException(nameof(ctxLocator)); 
     contextLocator = ctxLocator; 
    } 

    public T Get(Guid id) 
    { 
     //return _contextLocator.Get<MyDbContext>.Set<T>().Find(userId); 
    } 
} 

то, как это dbset должен быть решен? как мне работать с «MyDbContext» в методе Get? У меня есть несколько контекстов.

ответ

2
public abstract class RepositoryBase<T, TDbContext> : IRepository<T> where T : IDomainEntity where TDbContext : DbContext 
    { 
     private readonly DbSet<T> _dbset; 
     private readonly IAmbientDbContextLocator _contextLocator; 

     protected RepositoryBase(IAmbientDbContextLocator ctxLocator) 
     { 
      if (ctxLocator == null) throw new ArgumentNullException(nameof(ctxLocator)); 
      _contextLocator = ctxLocator; 
      _dbset = _contextLocator.Get<TDbContext>.Set<T>(); 
     } 

     protected DbSet<T> DbSet { get { return _dbset; } } 
     public T Get(Guid id) 
     { 
      return DbSet.Find(id); 
     } 
    } 

Если вы не хотите TDbContext, Вы можете отправить DbContext на конструктору рядом из contextlocator. Но он заставляет вас использовать DbContextScope, я не читал всю статью, но давайте не будем нарушать его логику.

Смежные вопросы