尝试创建一个通用存储库类,以使用依赖项注入,工作单元和存储库模式在C#中实现基本的CRUD操作。
我对这些概念很陌生。以下是我的代码。
public interface IUnitOfWork
{
IApplicationUserRepository Users { get; }
ICompanyRepository Companies { get; }
void Complete();
}
public class UnitOfWork : IUnitOfWork
{
private readonly ApplicationDbContext _context;
public IApplicationUserRepository Users { get; private set; }
public ICompanyRepository Companies { get; private set; }
public UnitOfWork(ApplicationDbContext context)
{
_context = context;
Users = new ApplicationUserRepository(context);
Companies = new CompanyRepository(context);
}
public void Complete()
{
_context.SaveChanges();
}
}
public interface IApplicationDbContext
{
DbSet<Company> Companies { get; set; }
IDbSet<ApplicationUser> Users { get; set; }
IDbSet<IdentityRole> Roles { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext
{
public DbSet<Company> Companies { get; set; }
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(ApplicationDbContext context)
{
_dbContext = context;
}
private ApplicationDbContext _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();
}
}
在上面的代码中,我想传递IApplicationDBContext而不是ApplicationDBContext来消除紧密耦合,但是当我使用IApplicationDbContext时,将无法访问诸如Set和SaveChanges之类的方法。我如何删除以上依赖而不丢失这些方法。我想通过构造函数传递子类存储库中的实际上下文。
答案 0 :(得分:0)
我认为,这应该做您想要的。如果将缺少的方法添加到接口,则基类(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,然后将其传递给您要在其中访问的Type。我只想将其与GenericRepository一起使用,那么您可能不需要接口和类上的泛型。因为那样的话,您只需要使用已经通用的Set ()。
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();
}
}
如果您不使用“默认数据集”,而仅将其与存储库一起使用,则可以在接口和上下文上省略泛型。
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();
}
}
当然,如果您真的喜欢通用的Interface和Context,则可以使用存储库中的DataSet属性代替.Set