Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
C# .NET核心中的项目引用与以前的.NET版本不同?_C#_Visual Studio_Architecture_.net Core - Fatal编程技术网

C# .NET核心中的项目引用与以前的.NET版本不同?

C# .NET核心中的项目引用与以前的.NET版本不同?,c#,visual-studio,architecture,.net-core,C#,Visual Studio,Architecture,.net Core,目前正在使用C#和dotnet Core建立一个新的Web Api。在引用其他项目时,我注意到一些奇怪的行为 我的解决方案非常简单:DataAccess、BusinessLogic、WebApi WebApi项目引用BusinessLogic项目,BusinessLogic项目引用DataAccess项目 现在使用.NET的早期版本,我的WebApi项目将无法访问DataAccess项目中的任何内容,但在我当前的设置中,我可以访问我的WebApi项目中DataAccess项目中的任何内容,而无需

目前正在使用C#和dotnet Core建立一个新的Web Api。在引用其他项目时,我注意到一些奇怪的行为

我的解决方案非常简单:DataAccess、BusinessLogic、WebApi

WebApi项目引用BusinessLogic项目,BusinessLogic项目引用DataAccess项目

现在使用.NET的早期版本,我的WebApi项目将无法访问DataAccess项目中的任何内容,但在我当前的设置中,我可以访问我的WebApi项目中DataAccess项目中的任何内容,而无需对其进行引用


请任何人解释一下这种行为,以及可能如何防止这种行为?

这就是您仅通过引用Microsoft.AspNetCore.all就可以获得所有AspNetCore软件包的方法

微软文档详细提到了这一点

另外,请注意,由于应用程序的合成根是WebAPI,因此您希望它能够看到DataAccess中的类型,以便可以向容器注册它们

实现这一点的一种方法是在您的业务逻辑上同时具有持久性的抽象。并反转BusinessLogic和DataAccess的参考(高级模块不应依赖于低级模块)

比如:

业务逻辑:

  • User.cs
  • IUserRepository.cs
数据访问:

  • UserRepository:IUserRepository
现在WebAPI项目可以引用DataAccess和BusinessLogic并在容器中注册:

Register<IUserRepository, UserRepository>();
Register();

您可以进一步使用DataAccess。抽象仅用于接口,但这将取决于您的项目和您希望进行的程度。

这就是您仅通过引用Microsoft.AspNetCore.all就可以获得所有AspNetCore包的方式

微软文档详细提到了这一点

另外,请注意,由于应用程序的合成根是WebAPI,因此您希望它能够看到DataAccess中的类型,以便可以向容器注册它们

实现这一点的一种方法是在您的业务逻辑上同时具有持久性的抽象。并反转BusinessLogic和DataAccess的参考(高级模块不应依赖于低级模块)

比如:

业务逻辑:

  • User.cs
  • IUserRepository.cs
数据访问:

  • UserRepository:IUserRepository
现在WebAPI项目可以引用DataAccess和BusinessLogic并在容器中注册:

Register<IUserRepository, UserRepository>();
Register();

您可以更进一步,拥有DataAccess。抽象仅用于接口,但这取决于您的项目和您想进行的程度。

找到了一种方法来防止此线程中出现这种行为:

编辑项目文件时,
PrivateAssets
属性可以设置为
All
,以防止这种行为

  <ItemGroup>
    <ProjectReference Include="..\DataAccess\1-DataAccess.csproj" PrivateAssets="All" />
  </ItemGroup>

找到了一种防止此线程中出现这种行为的方法:

编辑项目文件时,
PrivateAssets
属性可以设置为
All
,以防止这种行为

  <ItemGroup>
    <ProjectReference Include="..\DataAccess\1-DataAccess.csproj" PrivateAssets="All" />
  </ItemGroup>


我认为在业务逻辑中拥有存储库和实体或DAL相关接口是次优的。虽然IoC很好,但我宁愿有适当的层分离。在BLL和DAL中始终可以创建单独的IoC容器。也许我是以一种老式的方式思考的,我认为在业务逻辑中拥有存储库、实体或DAL相关接口是次优的。虽然IoC很好,但我宁愿有适当的层分离。在BLL和DAL中始终可以创建单独的IoC容器。也许我是在用一种老式的方式思考。