Sql server 如何在DDD解决方案中从WebApplication项目中删除EntityFramework.SqlServer引用
我在DDD(领域驱动设计)中有一个高度标准化的项目,因此这意味着每一层都有自己的职责,除了它自己和领域层之外,没有其他层知道 以下是我的项目结构: 我的Sql server 如何在DDD解决方案中从WebApplication项目中删除EntityFramework.SqlServer引用,sql-server,web-config,domain-driven-design,entity-framework-6,separation-of-concerns,Sql Server,Web Config,Domain Driven Design,Entity Framework 6,Separation Of Concerns,我在DDD(领域驱动设计)中有一个高度标准化的项目,因此这意味着每一层都有自己的职责,除了它自己和领域层之外,没有其他层知道 以下是我的项目结构: 我的Infra.Data层负责连接数据库,我正在使用EntityFramework进行持久化 我的问题是:为了使它能够与SQLServer数据库一起工作,我需要在我的WebApplication层中添加对EntityFramework.SQLServer的引用,这打破了我的关注点分离概念,如下所示 即使在myInfra.Data层中有相同的引用,
Infra.Data
层负责连接数据库,我正在使用EntityFramework
进行持久化
我的问题是:为了使它能够与SQLServer数据库一起工作,我需要在我的WebApplication
层中添加对EntityFramework.SQLServer
的引用,这打破了我的关注点分离概念,如下所示
即使在myInfra.Data
层中有相同的引用,也只是它应该在的地方,正如您在下面看到的那样
如果我从WebApplication
层删除EntityFramework.SqlServer
引用,它将停止工作,并在每次我尝试持久化数据时抛出异常,如下所示
我需要知道如何删除此引用以保持关注点的分离,因为现在的情况是,如果我想更改持久性,我必须更改我的WebApplication
。我的Web层甚至禁止包含任何带有“EntityFramework”字样的内容。我希望完全分离关注点,以在不影响任何其他层的情况下更改任何层
如果我在我的Web.config文件中注册我的
提供程序,它将只在项目中有EntityFramework.SqlServer
时起作用,但是没有WebApplication
上的EntityFramework.SqlServer
引用,它会错过名称空间并对此进行投诉
注意:我的项目也成功连接到MySql数据库,我不需要像预期的那样引用MySql.Data
或我的WebApplication
层中的任何其他MySql库
请帮助我,我的DDD/Separation of Concerns OCD正在破解它,谢谢。您将无法摆脱实体框架配置和Web应用程序中所需的DLL:
- 假设您的基础架构层和域层需要依赖于实体框架。这意味着这两个库需要对Entity Framework DLL进行物理访问(安装Entity Framework软件包)并进行配置
- 当您运行依赖于基础结构和域库的web应用程序时,底层库(基础结构和域)使用的所有DLL都需要物理存在并进行配置,否则将出现运行时问题(程序可能是可编译的,但会出现运行时错误)
internal static class ForceEFToCopyDllToOutput
{
private static SqlProviderServices instance = SqlProviderServices.Instance;
}
执行此操作时,请让编译器知道特定资源已被使用,并且应该在bin文件夹中可用
有些人认为这是一个黑客行为,但是如果你想让你的层远离基础设施的关注,这是有用的。
您可以在此处阅读更多关于此的信息:
编辑:
现在您只需将连接字符串从Infra.Data app.config复制到WebApplication web.config
<connectionStrings>
<add name="DatabaseConnectionString" providerName="System.Data.SqlClient" connectionString="..." />
</connectionStrings>
谢谢,尽管这是无法维持的自然状态,但这正是我所需要的。@EdgarSalazar不客气。如果这解决了你的问题,别忘了把它标记为答案。