我有标准的 Repository 接口(interface)设置:
public interface IRepository<T, TKey> : IDisposable where T : class
{
T Get(TKey id);
IEnumerable<T> Get();
IEnumerable<T> Find(Expression<Func<T, bool>> whereClause);
T Add(T entity);
void Delete(T entity);
bool Save();
int Update(T entity);
}
它有一个实现:
public class EfRepository<T, TKey> : IRepository<T, TKey> where T : class
{
protected DbContext _context;
public EfRepository(DbContext context) { ...}
public virtual T Get(TKey id) {...}
public virtual IEnumerable<T> Get() { ...}
public virtual IEnumerable<T> Find(Expression<Func<T, bool>> whereClause) { ...}
public T Add(T entity) { ...}
public void Delete(T entity) { ...}
public bool Save() { ...}
public int Update(T entity) { ...}
}
我在所有这些之上有一个服务层:
public class VehicleService: IVehicleService
{
private readonly IRepository<Vehicle, int> _repository;
public VehicleService(IRepository<Vehicle, int> repository)
{
_repository = repository;
}
public IEnumerable<int> GetModelYears()
{
// ?? help?
}
}
我的问题是,在哪里实现 Distinct 方法? LINQ 查询如下所示:
context.Set<Vehicle>().Select(x => x.ModelYear).Distinct();
我还没有想出如何在存储库级别对 Distinct 方法进行通用编码,而且我认为这不是放置它的正确位置。
我们选择不在我们的存储库中返回 IQueryable。但我也没有向服务层公开任何实际的 DbSet 对象。
也许更好的问题是,这是一种正确的做事方式吗?有没有更好的办法?
最佳答案
如果这只是用于一种对象,而不是存储库中的所有用途,您可以创建一个新的存储库,包含该查询,但构建在 IRepository 上。
public interface IVehicleRepository : IRepository<Vehicle>{
IEnumerable<int> GetDistinctVehicle();
}
public VehicleRepository : EfRepository<Vehicle>, IVehicleRepository{
public VehicleRepository(DbContext context) : base(context)
{
}
public IEnumerable<int> GetDistinctVehicle(){
Context.Set<Vehicle>().Select(x=> x.ModelYear).Distinct();
}
}
这样,您仍然可以使用所有 IRepositorystuff,但也可以使用您的额外方法。只需在您选择的注入(inject)器中将 IVehicleRepository 绑定(bind)到 VehicleRepository,然后像使用 IRepositories 一样将其注入(inject)构造函数。
关于c# - 在 Repository Pattern 中,我应该在哪里实现 Distinct 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227021/