我有一个多层应用程序,该应用程序从所有数据访问的存储库模式开始,并且可以返回到服务层。包括所有业务逻辑的服务层将ILIST返回到控制器(注意:我使用的是UI层的ASP.NET MVC)。在数据访问层中返回iQueryable的好处是,它允许我的存储库非常简单,并且可以推迟数据库查询。但是,我在服务层中触发数据库查询,以使我的单元测试更可靠,并且我不为控制器重塑查询而灵活。但是,我最近遇到了几种情况,在这些情况下,将查询执行递延到控制器上的性能要大得多,因为控制器必须对UI特定的数据进行一些预测。此外,随着ODATA之类的出现,我开始怀疑终点(例如Web UI或Web API)是否应该直接与Iquyble一起使用。你觉得呢?你有没有什么想法?是时候开始从服务层返回IQueryable的时间了吗?还是坚持iList?

此线程在这里: 返回iQueryableu003CT>还是不返回iQueryableu003CT>似乎保证将ILIST返回UI层,但我想知道由于新的新兴技术和技术,情况是否正在发生变化。

有帮助吗?

解决方案

我喜欢在可能的情况下坚持使用可音机界面,唯一的问题是,如果您有类似的内容,则最终在控制器级别进行复杂的过滤或按需进行复杂的过滤或重新查询。

//DATA ACCESS
    public IQueryable<T> GetStudents()
    {
    return db.Students;
    }

在您的控制器中,您会重新分发,因为您的客户想过滤一些结果,您肯定会在控制器级别上进行操作:

var result = obj.GetStudents().Where(d=>d...);

对我而言,它可以,但是只需对任何其他模块使用相同的过滤器进行成像,您就无法称呼它,因为它在控制器级别上。因此,对我来说,这是干燥,灵活性以及系统的可扩展性之间的平衡。如果您需要一个完全可扩展的系统,则需要对GetStudents()方法进行一些或几个过载,并在控制器级别上摆脱任何重新分发。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top