在 .NET Core 中使用依赖关系

Using dependency of dependency in .NET Core

我正在尝试了解依赖项在 .NET Core 中的工作方式。

假设我有 2 个项目。 Project1 具有以下定义:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Project2\Project2.csproj" />
  </ItemGroup>
</Project>

而这个使用 Newtonsoft.Json 依赖项的单个 class:

public class Wizard
{
    public void DoMagic()
    {
        var settings = Newtonsoft.Json.JsonConvert.DefaultSettings;
    }
}

如您所见,它还引用了Project2,其定义如下:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
</Project>

当我从 Project1 中删除 Newtonsoft.Json 包引用时,我希望它不再编译...但它确实编译了!看起来,它能够使用 Project2.

的依赖项 Newtonsoft.Json

所以我有两个问题:

  1. 为了方便起见,我已经使用“内部”项目引用完成了测试,但这与外部包引用的工作方式是否相同(即 NuGet)?
  2. 任何人都可以解释这里的基本原理吗?这对我来说似乎很冒险,如果我的项目正在使用,则更改我项目的任何依赖项中的依赖项都可能破坏我的项目那个子依赖。换句话说,为什么允许这样做?隐式使用依赖的依赖似乎总是一个坏主意,因为它可能会改变和破坏你的代码,那么为什么框架允许吗?
  1. 是的,这就是它在所有方面的工作方式。

  2. 你可以用PrivateAssets来控制这个:

https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#controlling-dependency-assets