我已经建立了标准的仓库接口:
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对象暴露给服务层。
也许更好的问题是,这样做是正确的方式吗?是否有更好的方法?