繁体   English   中英

如何使表示层(ASP.NET MVC)的数据访问技术(Entity Framework)无知?

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

前提:

我正在执行域驱动设计,并将解决方案分为4层:

  • 表示层
    • 用于RESTful API Web服务的ASP.NET Web API 2项目
    • 用于文档和管理屏幕的ASP.NET Web MVC5项目
  • 应用层
    • 一个类库项目,负责从表示层获取命令并使用任何域服务
  • 域层
    • 包含业务模型和逻辑的类库项目
    • 包含域服务的类库项目
  • 基础设施层
    • 一个包含所有具体实现的类库项目,例如使用Entity Framework进行dataq持久性,使用Log4net进行日志记录,使用Simple Injector进行IoC等

域层仅具有一组为聚合定义的存储库接口,这取决于基础结构层中隐藏实现细节的实现数据访问机制。

在本练习中,我决定使用实体框架数据库优先方法。 当然,基础结构项目中有一个app.config ,其中包含一个连接字符串。


问题:

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

例如,当我选择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中的连接字符串复制并粘贴到API项目的web.config中,则一切正常。 但这违反了我们分离关注点的初衷,不是吗? 如果这样做,那么使用域驱动设计并使表述层的数据访问技术变得无知的意义何在?

我们之所以没有直接引用数据访问技术的直接实现(即,使用dbContextLinq具体实现)的原因是,我们可以轻松地将地下访问技术转换为其他东西。

那么什么是正确的方法呢?

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

实体框架配置必须在使用它的项目中。 这并不意味着它将破坏您的分层结构或您的关注点分离。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM