如何从 DDD 解决方案中的 Web 应用程序项目中删除 EntityFramework.SqlServer 引用

How to remove EntityFramework.SqlServer Reference from WebApplication project in a DDD Solution

我在 DDD(领域驱动设计)中有一个高度标准化的项目,所以这意味着每一层都有自己的职责,除了自身和领域层之外,没有任何层知道。

这是我的项目的结构:

我的 Infra.Data 层负责与数据库连接,我坚持使用 EntityFramework

我的问题是:为了让它与 SQLServer 数据库一起工作,我需要在我的 WebApplication 层中添加对 EntityFramework.SqlServer 的引用,这打破了我关注点分离的概念,因为你可以看下面。

即使在我的 Infra.Data 图层中有相同的参考,它应该在的地方,如下所示。

如果我从 WebApplication 层中删除 EntityFramework.SqlServer 引用,它将停止工作,并且每次我尝试持久化数据时都会抛出异常,如下所示。

我需要知道如何删除此引用以保持关注点分离,因为现在是这样,如果我想更改我的持久性,我将不得不更改我的 WebApplication。我的 Web 层甚至被禁止包含 "EntityFramework" 一词。我希望完全分离关注点以更改任何层而不影响其他层。

如果我在我的 Web.config 文件中注册我的 <entityFramework> 供应商,只有当我在项目中有 EntityFramework.SqlServer 时它才会起作用,但没有 WebApplication 上的 EntityFramework.SqlServer 引用,它会错过名称空间并抱怨它。

注意:我的项目也成功连接到MySql数据库,我不需要对MySql.Data或任何其他[=66]的引用=] 库在我的 WebApplication 层中,正如预期的那样。

请帮助我,我的 DDD/Separation 强迫症问题正在解决,谢谢。

不会能够在您的 Web 应用程序中删除实体框架配置和所需的 DLL :

  • 假设您的基础设施层和领域层需要依赖实体框架。这意味着这两个库需要对 Entity Framework DLL(安装了 Entity-framework 包)进行物理访问并进行配置。
  • 当您 运行 您的 Web 应用程序依赖于基础架构和域库时,底层库(基础架构和域)使用的所有 Dll 都需要物理存在并进行配置,否则您将 运行 时间问题(程序可能是可编译的,但你会得到 运行-时间错误)。

故事的寓意:如果应用程序 x [无论它属于哪个层] 依赖于库 y、z 和库 y、z 依赖于某些 dll 并需要配置,应用程序 x 才能在 运行-您需要让 y,z 所需的所有 dll 可用并在您的实例中提供它们的配置 (web.config)。

你显然可以提供一些解决方法,例如直接复制文件并为每一层提供单独的配置文件,但我强烈建议不要这样做,因为它会变得非常混乱并且在很长一段时间内很难维护 运行 .

你可以!

只需在您的 Infra.Data 项目中创建此 class:

internal static class ForceEFToCopyDllToOutput
{
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

当您这样做时,您让编译器知道特定资源已被使用并且应该在 bin 文件夹中可用。

有些人认为这是一种 hack,但如果您想让您的层不受基础设施问题的影响,它会很有用。

您可以在此处阅读更多相关信息:DLL reference not copying into project bin

编辑:

您现在需要做的就是将连接字符串从您的 Infra.Data app.config 复制到您的 WebApplication web.config

<connectionStrings>
    <add name="DatabaseConnectionString" providerName="System.Data.SqlClient" connectionString="..." />     
</connectionStrings>