查找值的通用存储库

时间:2014-06-30 10:10:34

标签: c# .net entity-framework generics

我在数据库中有一堆查找实体(总共约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>();
    }

}

3 个答案:

答案 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的一个