尝试使用依赖注入,工作单元和存储库模式创建用于在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等方法的访问将丢失。如何在不丢失这些方法的情况下删除上述依赖项。我想通过构造函数从我的子类库中传递实际的上下文。
我想,这应该做,你想要什么。如果将缺少的方法添加到接口,则基类(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 <U>()。
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();
}
}
当然,如果您真的喜欢通用接口和上下文,则可以使用存储库中的DataSet属性而不是.Set <T>()。