如何让表现层(ASP.NET MVC)对数据访问技术(Entity Framework)一无所知?
How to make the data access technology (Entity Framework) ignorance from the presentation layer (ASP.NET MVC)?
前提:
我正在练习领域驱动设计,我将我的解决方案分为 4 层:
- 表示层
- 一个 ASP.NET Web API 2 项目 RESTful API Web 服务
- 用于文档和管理屏幕的 ASP.NET Web MVC5 项目
- 应用层
- 一个 class 库项目负责从表示层获取命令并使用任何域服务
- 领域层
- 包含业务模型和逻辑的 class 库项目
- 包含域服务的 class 库项目
- 基础设施层
- 一个 class 包含所有具体实现的库项目,例如使用 Entity Framework 的 dataq 持久性、使用 Log4net 的日志记录、使用 Simple Injector 的 IoC 等
领域层只有一组为聚合定义的存储库接口,它取决于基础设施层中存在的实现数据访问机制来隐藏实现细节。
在本练习中,我决定使用 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 项目,事情会成功的。但这打破了我们分离关注点的初衷,不是吗?如果我们这样做,那么使用领域驱动设计并使数据访问技术从表示层无知的意义何在?
我们不直接引用数据访问技术的直接实现(即使用 dbContext
和 Linq
的具体实现)的原因是我们可以轻松地将地下访问技术切换为其他技术.
那么正确的做法是什么?!!
我不想在我的表示层中安装 Entity Framework,也不想到处复制连接字符串。我希望存储库的所有数据访问和具体实现都存在于一个库中。
Entity Framework 配置必须在使用它的项目中。这并不意味着它会破坏您的分层结构或您的关注点分离。
从 app.config 中删除所有 entityframework 个元素。创建您自己的连接字符串元素并在应用程序启动时将其提供给 entityframework。
前提:
我正在练习领域驱动设计,我将我的解决方案分为 4 层:
- 表示层
- 一个 ASP.NET Web API 2 项目 RESTful API Web 服务
- 用于文档和管理屏幕的 ASP.NET Web MVC5 项目
- 应用层
- 一个 class 库项目负责从表示层获取命令并使用任何域服务
- 领域层
- 包含业务模型和逻辑的 class 库项目
- 包含域服务的 class 库项目
- 基础设施层
- 一个 class 包含所有具体实现的库项目,例如使用 Entity Framework 的 dataq 持久性、使用 Log4net 的日志记录、使用 Simple Injector 的 IoC 等
领域层只有一组为聚合定义的存储库接口,它取决于基础设施层中存在的实现数据访问机制来隐藏实现细节。
在本练习中,我决定使用 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 项目,事情会成功的。但这打破了我们分离关注点的初衷,不是吗?如果我们这样做,那么使用领域驱动设计并使数据访问技术从表示层无知的意义何在?
我们不直接引用数据访问技术的直接实现(即使用 dbContext
和 Linq
的具体实现)的原因是我们可以轻松地将地下访问技术切换为其他技术.
那么正确的做法是什么?!!
我不想在我的表示层中安装 Entity Framework,也不想到处复制连接字符串。我希望存储库的所有数据访问和具体实现都存在于一个库中。
Entity Framework 配置必须在使用它的项目中。这并不意味着它会破坏您的分层结构或您的关注点分离。
从 app.config 中删除所有 entityframework 个元素。创建您自己的连接字符串元素并在应用程序启动时将其提供给 entityframework。