存储库应该实现IQueryable <T>吗?
时间:2020-03-06 15:02:51 来源:igfitidea点击:
我正在考虑两个IRepository接口之一,一个是IQueryable的后代,另一个包含IQueryable。
像这样:
public interface IRepository<T> : IQueryable<T> { T Save(T entity); void Delete(T entity); }
或者这个:
public interface IRepository<T> { T Save(T entity); void Delete(T entity); IQueryable<T> Query(); }
LINQ的用法是:
from dos in ServiceLocator.Current.GetInstance<IRepository<DomainObject>>() where dos.Id == id select dos
或者...
from dos in ServiceLocator.Current.GetInstance<IRepository<DomainObject>>().Query where dos.Id == id select dos
我有点像第一个,但是嘲笑是有问题的。其他人如何实现LINQable可模拟存储库?
解决方案
取决于我们是否需要Has-A或者Is-A关系。
第一个是Is-A关系。 IRepository接口是一个IQueryable接口。第二个是has-a。 IRepository具有IQueryable接口。在编写此代码的过程中,我实际上更喜欢第二个而不是第一个,仅因为在使用第二个IRepository时,我可以给Query()方法返回IQueryable的任何东西。对我来说,这比第一种实施方式更灵活。
我们总是可以针对List快速编写东西,它不是使用模拟框架进行模拟,但确实可以很好地工作。