Я думаю, это должно делать то, что вы хотите. Если вы добавляете недостающие методы в интерфейс, базовый класс (DbContext) уже реализовал его. Так что нет необходимости внедрять его снова.
public interface IApplicationDbContext<T> where T: class
{
//Identity Management
IDbSet<ApplicationUser> Users { get; set; }
IDbSet<IdentityRole> Roles { get; set; }
//Datamanagement
DbSet<T> DataSet { get; set; } //the Dataset of T
DbSet<U> Set<U>() where T: class; //get other DataSets
int SaveChanges(); //save the changes
}
Затем сделайте ApplicationDbContext Generic и передайте ему тип, к которому вы хотите получить доступ. Я хочу, чтобы вы использовали его только с GenericRepository, тогда вам может не понадобиться Generics для интерфейса и класса. Потому что тогда вы просто используете уже общий набор ().
public class ApplicationDbContext<T> : IdentityDbContext<ApplicationUser>, IApplicationDbContext<T>
{
public DbSet<T> DataSet{ get; set; }
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create<T>()
{
return new ApplicationDbContext<T>();
}
}
Теперь, когда контекст является общим и интерфейс имеет методы, вы можете использовать Интерфейс в Репозитории.
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class, new()
{
protected GenericRepository(IApplicationDbContext<T> context)
{
_dbContext = context;
}
private TApplicationDbContext<T> _dbContext;
private static IEnumerable<T> entity;
public IEnumerable<T> Get(bool forceRefresh = false)
{
if (forceRefresh || entity == null)
entity = _dbContext.Set<T>();
return entity;
}
public async Task AddAsync(T entity)
{
_dbContext.Set<T>().Add(entity);
await _dbContext.SaveChangesAsync();
}
public async Task RemoveAsync(T entity)
{
_dbContext.Set<T>().Remove(entity);
await _dbContext.SaveChangesAsync();
}
}
Если вы не используете «набор данных по умолчанию» и используете его только с репозиторием, вы можете опустить Generics в интерфейсе и контексте.
public interface IApplicationDbContext
{
//Identity Management
IDbSet<ApplicationUser> Users { get; set; }
IDbSet<IdentityRole> Roles { get; set; }
DbSet<U> Set<U>() where T: class; //get DataSets
int SaveChanges(); //save the changes
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
public abstract class GenericRepository<T> : IGenericRepository<T> where T : class, new()
{
protected GenericRepository(IApplicationDbContext context)
{
_dbContext = context;
}
private IApplicationDbContext _dbContext;
private static IEnumerable<T> entity;
public IEnumerable<T> Get(bool forceRefresh = false)
{
if (forceRefresh || entity == null)
entity = _dbContext.Set<T>();
return entity;
}
public async Task AddAsync(T entity)
{
_dbContext.Set<T>().Add(entity);
await _dbContext.SaveChangesAsync();
}
public async Task RemoveAsync(T entity)
{
_dbContext.Set<T>().Remove(entity);
await _dbContext.SaveChangesAsync();
}
}
И, конечно, если вам действительно нравятся универсальный интерфейс и контекст, вы можете использовать свойство DataSet в репозитории вместо .Set ().