Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在DDD解决方案中从WebApplication项目中删除EntityFramework.SqlServer引用_Sql Server_Web Config_Domain Driven Design_Entity Framework 6_Separation Of Concerns - Fatal编程技术网

Sql server 如何在DDD解决方案中从WebApplication项目中删除EntityFramework.SqlServer引用

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层中有相同的引用,

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

以下是我的项目结构:

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

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

即使在my
Infra.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都需要物理存在并进行配置,否则将出现运行时问题(程序可能是可编译的,但会出现运行时错误)
故事的寓意:如果应用程序x[无论它属于哪一层]依赖于库y、z和库y,z依赖于某些dll并需要配置,则应用程序x要在运行时工作,您需要使y、z所需的所有dll可用,并在实例中提供它们的配置(web.config)

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

你可以

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

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不客气。如果这解决了你的问题,别忘了把它标记为答案。