【问题标题】:How to remove EntityFramework.SqlServer Reference from WebApplication project in a DDD Solution如何从 DDD 解决方案中的 WebApplication 项目中删除 EntityFramework.SqlServer 参考
【发布时间】:2015-09-16 07:59:27
【问题描述】:

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

这是我的项目的结构:

我的Infra.Data 层负责连接数据库,我正在使用EntityFramework 进行持久化。

我的问题是:为了使它与 SQLServer 数据库一起使用,我需要在我的 WebApplication 层中添加对 EntityFramework.SqlServer 的引用,这打破了我的关注点分离概念,如下所示。

即使在我的Infra.Data 层中具有相同的引用,这只是它应该在的位置,如下所示。

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

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

如果我在我的 Web.config 文件中注册我的<entityFramework> 提供程序,则它仅在我在项目中有EntityFramework.SqlServer 但没有@ 上的EntityFramework.SqlServer 引用时才有效987654336@,它错过了命名空间并抱怨它。

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

请帮助我,我的 DDD/关注点分离强迫症正在破解它,谢谢。

【问题讨论】:

    标签: sql-server web-config domain-driven-design entity-framework-6 separation-of-concerns


    【解决方案1】:

    不会在您的 Web 应用程序中摆脱实体框架配置和所需的 DLL:

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

    故事的精神:如果应用程序 x [不管它属于哪个层] 依赖于库 y,z 并且库 y,z 依赖于一些 dll 并且需要配置,那么应用程序 x 可以在运行时工作需要提供 y,z 所需的所有 dll,并在您的实例中提供它们的配置 (web.config)。

    您显然可以提供一些解决方法,例如直接复制文件并为每一层提供单独的配置文件,但我强烈建议不要这样做,因为从长远来看,它会变得非常混乱且难以维护。

    【讨论】:

      【解决方案2】:

      你可以!

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

      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>
      

      【讨论】:

      • 谢谢,尽管它是不可维护的,但这正是我所需要的。
      • @EdgarSalazar 不客气。如果这解决了您的问题,请不要忘记将其标记为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多