存储库应该实现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快速编写东西,它不是使用模拟框架进行模拟,但确实可以很好地工作。