【发布时间】:2017-03-24 17:23:20
【问题描述】:
我已经使用IRepository 模式实现了我的数据层。其中一种方法返回IQueryable:
public virtual IQueryable<TEntity> Queryable()
{
return dbSet;
}
我还有一个服务层,它调用这个提供过滤的方法,例如:
public User GetByName(string name)
{
return _repository.Queryable()
.Where(a => a.Name == name)
.ToList();
}
到目前为止这么好,Entity Framework 只在数据层引用,Service 层对此一无所知。
现在,我想做两件事:
- 使用
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,它不应该关心或知道这一点,但在保持架构清洁的同时看不到如何解决这个问题。我能看到的唯一解决方案是:
- 将实体框架添加到服务层
- 向包装
IRepository<User>' and handles the two additional methods required. The service will then take use an instance of this rather thanIRepository`的数据层(UserData)添加一个新类。
关于我如何在坚持最佳实践的同时解决这个问题有什么建议吗?
【问题讨论】:
-
如果您只是要公开一个允许业务层编写自己的查询的调用,我真的不明白抽象出 EF 的意义。它让存储库对我来说有点毫无价值。与问题无关,我只是好奇那里的逻辑。
-
我觉得
Include部分真的应该在存储库中。本质上,存储库应该知道根据对象图返回什么,并且这些操作应该简单地支持任何用例的业务需求。如果ToListAsync在 EF 之外会很好,我同意。虽然我想我对它的实现知之甚少,不知道它在 EF 之外是否有意义。 -
除了“最佳实践”之外,您为什么要使用存储库,原因是什么?也许您希望缓存结果或其他内容。
-
即使有人有 gd 链接可供阅读,我也希望能对此进行更新。我发现我总是在有意义的事情之间纠结。
标签: c# entity-framework architecture n-tier-architecture