我使用 IRepository
模式实现了我的数据层。其中一个方法返回一个 IQueryable
:
public virtual IQueryable<TEntity> Queryable()
{
return dbSet;
}
我还有一个Service层调用了这个方法,提供筛选功能,例如:
public User GetByName(string name)
{
return _repository.Queryable()
.Where(a => a.Name == name)
.ToList();
}
到目前为止,Entity Framework 仅在数据层中被引用,服务层对此一无所知。
现在,我想要做两件额外的事情:
- 使用 Include 方法
- 使用 ToListAsync() 方法
public async Task<User> GetByName(string name)
{
return await _repository.Queryable()
.Where(a => a.Name == name)
.Include(x => x.Pets)
.ToListAsync();
}
现在的问题是
Include()
和ToListAsync()
都在System.Data.Entity
命名空间中,该命名空间位于EntityFramework.dll
中。我不想在我的服务层中引用EF,因为它不应该关心或知道这一点,但我看不到其他解决方法,同时保持架构的清晰。我能想到的唯一解决方案是:
- 将Entity Framework添加到服务层
- 在数据层中添加一个新类(
UserData
),其包装了IRepository<User>
并处理所需的两个额外方法。服务将使用此实例而不是IRepository`
。
Include
部分应该放在仓库里面。实际上,仓库应该知道以对象图的形式返回什么,并且这些操作应该支持任何用例的业务需求。如果ToListAsync
不是 EF 的一部分会更好,我同意这一点。虽然我猜我不太了解它的实现,不知道它是否有可能在 EF 之外存在。 - DavidIQueryable
时,你都会强制API的使用者对实现有着深入的了解。你不妨添加一个EF的引用。 - Gert Arnold