如何从 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>
我在 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>