如何在 n 层分层应用程序中使用 Entity Framework(4) 编译查询?

Posted

技术标签:

【中文标题】如何在 n 层分层应用程序中使用 Entity Framework(4) 编译查询?【英文标题】:How to use Entity Framework(4) compiled queries in an n-tier layered application? 【发布时间】:2012-06-20 05:56:00 【问题描述】:

我遇到了 Entity Framework 4 的 n 层应用程序设计问题。

服务器端,我的应用程序有 3 层: - 一个服务层(WCF) - 一个业务层 - 一个数据访问层(使用 EF4)

实体是 POCO,放置在独立的项目/程序集中。

我使用依赖注入来创建业务和数据访问层的对象,因此我只使用接口,我的业务层不依赖于 EF。

我想使用 EF 编译查询来提高性能。

但我的(业务)查询是在业务层中定义的,因为在我的架构中,DataAccess 仅提供 CRUD 方法。

所以编译后的查询应该在业务层定义,但我不依赖 EF 也不希望保持松耦合,因此我不能从那里调用 ObjectContext。

在 DataAccess 中定义查询不适合我的应用程序设计。

那么有谁知道是否有一种通用的方法可以将业务查询从业务层注入到 DataAccess 层,以便我可以将它们与编译查询一起使用?

我尝试了很多东西,到处找,找不到答案... :( 看起来 EF 不适合那种 n 层应用程序。

【问题讨论】:

【参考方案1】:

编译查询属于数据访问层,因为它是依赖于数据访问类的数据访问特定功能。如果您的设计不接受这一点,那么它根本就没有为数据访问特定功能做好准备 = 要么更改您的设计,要么不使用数据访问特定功能。

最简单的方法是将已编译的查询添加到您的上下文中,并将它们作为上下文中的方法公开:

public IQueryable<SomeEntity> SomeQuery(string someParam) 
    return compiledQuery.Invoke(this, someParam);

现在您将这些方法添加到上下文的接口中。

您可以遵循类似的方法,在业务层可见的任何数据访问接口上公开编译后的查询。

【讨论】:

thanx,那是我不想读的,但我知道我会... :)

以上是关于如何在 n 层分层应用程序中使用 Entity Framework(4) 编译查询?的主要内容,如果未能解决你的问题,请参考以下文章

.NET 分布式分层应用程序

N层架构

嵌入式中实现应用层和硬件层分层管理

使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

ABP官方文档翻译 1.2 N层架构

jsp开发中、servlet、dao层、biz层、entity层到底各自啥作用?