禁用.NET Standard 2中的传递项目引用

时间:2017-10-12 11:56:49

标签: c# asp.net-core .net-standard .net-standard-2.0

我正在使用ASP.NET Core 2.0编写MVC网站。

在ASP.NET Core项目中(我们称之为Web),我在同一个解决方案中引用了.NET Standard 2项目(我们称之为Service)。 Service项目还引用了解决方案中的第三个.NET Standard 2库(让我们称之为Business)。 Business项目声明了一个名为Model的类型。

问题是我可以在Model项目中使用Web(即编译器看到类型Model,我可以var a = new Model();),就好像{{ 1}}项目引用了Web,但它实际上只引用了Business

如何从Service隐藏Model?这是ASP.NET Core 2中的新功能还是所有.NET Standard项目都是这样的?

修改

如指定的here,这是由于传递项目引用,这是.NET Standard中的一个新“功能”,但我该如何解决?

2 个答案:

答案 0 :(得分:10)

传递项目引用是.NET Core / .NET> = 5中使用的SDK样式csproj(12)格式的新功能。对于旧的.NET,也可以使用此csproj框架项目(123),但有一些exceptions

在这种SDK样式格式中,项目引用(由.csproj文件中的<ProjectReference>条目表示)是可传递的。这与以前使用的旧的非SDK .csproj不同。

但是您有两种选择可以返回到旧的非传递性行为。

  1. 在.csproj中使用<DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>属性,该属性引用了您不希望其传递依赖项被编译器可见的项目。

    您可以将其添加到 Web 项目中。 (引用其他项目的第一个项目, Web -> 服务-> 业务

    您还可以通过在包含源的根文件夹中的Directory.Build.props文件中对所有.csprojs全局设置此行为。

    <Project>
      <PropertyGroup>    
        <DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
      </PropertyGroup>
    </Project>
    

    使用此文件,您基本上具有旧的项目参考行为。当您将使用旧csproj格式的旧.NET Framework解决方案迁移到新的SDK样式的.csprojs时很有用。

  2. 在您引用的项目上,您可以设置在引用该项目时不应进一步依赖哪些依赖项。为此,请在PrivateAssets="All"上使用<ProjectReference>属性。因此,例如,您可以像这样编辑 Service .csproj:

    <ItemGroup>
        <ProjectReference Include="..\Business.csproj" PrivateAssets="All" />
    </ItemGroup>
    

    这是一种更灵活,更细粒度的方法。您可以控制带有特定传递项目的引用,在引用该项目时应该可见。

这取决于您的喜好。如果您习惯了旧的csproj行为,或者想将旧的解决方案迁移到.NET Core,则只需使用DisableTransitiveProjectReferences。这是最简单的解决方案。

答案 1 :(得分:9)

我的问题接近一个标记为重复的问题,但要解决它需要不同的策略。

感谢“Federico Dipuma”的评论和给出的答案here我能够解决这个问题。

您应修改Service.csproj文件,并将PrivateAssets="All"添加到您不希望流向顶部的ProjectReference个键。

<ItemGroup>
    <ProjectReference Include="..\Business.csproj" PrivateAssets="All" />
</ItemGroup>