我在数据库中有一堆查找实体(总共约10个),它们都实现了以下接口
interface ILookupValue
{
int Id { get; set; }
string Name { get; set; }
string Description { get; set; }
}
目前,我为每个实现ILookupRepository接口的实体提供了一个存储库
public interface ILookupRepository<T> where T : class
{
IEnumerable<T> GetLookupData();
}
示例实施
public class CustomerRepository : ILookupRepository<Customer>
{
public IDbContext _context;
public CustomerRepository(IDbContext context)
{
context = _context;
}
public IEnumerable<Customer> GetLookupData()
{
return _context.Set<Customer>();
}
}
我预计任何存储库都不需要任何其他方法,那么有没有一种方法可以为这种方案创建一个通用存储库,而无需为每种查找类型添加额外的代码存储库?
编辑:根据Dennis_E的回答,这就是我要去的地方
public class LookupRepository<T> : ILookupRepository<T> where T : class, ILookupValue
{
public IDbContext _context;
public LookupRepository(IDbContext context)
{
context = _context;
}
public IEnumerable<T> GetLookupData()
{
return _context.Set<T>();
}
}
答案 0 :(得分:2)
这个课看起来很通用。
public class LookupRepository<T> : ILookupRepository<T>
{
public IDbContext _context;
public LookupRepository(IDbContext context)
{
context = _context;
}
public IEnumerable<T> GetLookupData()
{
return _context.Set<T>();
}
}
然后使用new LookupRepository<Customer>();
答案 1 :(得分:0)
您将需要一个通用基类,然后让您的CustomerRepository
继承自:
public class GenericRepository<T> : ILookupRepository<T>
{
protected readonly IDbContext _context;
protected GenericRepository(IDbContext context)
{
_context = context;
}
public IEnumerable<T> GetLookupData()
{
return _context.Set<T>();
}
}
然后您可以直接创建GenericRepository<Customer>
的实例,或者如果您愿意,让您的IoC容器为您注入该依赖项。
答案 2 :(得分:0)
它看起来很通用,但是当你需要让连接语句一次性击中DB时,一种方法可能会派上用场。
返回IQueryable的一个