如何让表现层(ASP.NET MVC)对数据访问技术(Entity Framework)一无所知?

How to make the data access technology (Entity Framework) ignorance from the presentation layer (ASP.NET MVC)?

前提:

我正在练习领域驱动设计,我将我的解决方案分为 4 层:

领域层只有一组为聚合定义的存储库接口,它取决于基础设施层中存在的实现数据访问机制来隐藏实现细节。

在本练习中,我决定使用 Entity Framework 数据库优先方法。当然,在包含连接字符串的基础设施项目中有一个app.config


问题:

好的,我花了很多时间试图分离所有关注点并专注于领域模型。在表示层(即 API 和 MVC 项目),没有直接引用基础设施项目。并且 IoC 容器已设置,因此所需接口的所有具体实现都将注入控制器构造函数。

当我select,例如,API项目作为启动项目和运行它,我得到

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code.

Additional information: No connection string named 'xxxxxx' could be found in the application config file.


问题:

现在我明白了,如果我将 Entity Framework 安装到 API 项目中,将基础设施项目 app.config 中的连接字符串复制并粘贴到 web.config 中API 项目,事情会成功的。但这打破了我们分离关注点的初衷,不是吗?如果我们这样做,那么使用领域驱动设计并使数据访问技术从表示层无知的意义何在?

我们不直接引用数据访问技术的直接实现(即使用 dbContextLinq 的具体实现)的原因是我们可以轻松地将地下访问技术切换为其他技术.

那么正确的做法是什么?!!

我不想在我的表示层中安装 Entity Framework,也不想到处复制连接字符串。我希望存储库的所有数据访问和具体实现都存在于一个库中。

Entity Framework 配置必须在使用它的项目中。这并不意味着它会破坏您的分层结构或您的关注点分离。

从 app.config 中删除所有 entityframework 个元素。创建您自己的连接字符串元素并在应用程序启动时将其提供给 entityframework。