.Net Core 1.1 中的传递引用

Posted

技术标签:

【中文标题】.Net Core 1.1 中的传递引用【英文标题】:Transitive references in .Net Core 1.1 【发布时间】:2017-07-14 16:35:20 【问题描述】:

在 .NET Core 1.1 和 Visual Studio 2017 RC 中开发示例 Web 应用程序时,我意识到以下几点:

如你所见:

ClassLibrary3 引用了 ClassLibrary2, 并且 ClassLibrary2 引用了 ClassLibrary1

我在 ClassLibrary3 项目的 Class3 中写了一个简单的方法,Intellisense 允许我使用 Class1 只是写下类的名称,我的意思是,没有对 ClassLibrary1 项目进行显式引用。

我在这里错过了什么吗?我不希望有人简单地来忽略 ClassLibrary2。

谢谢。

【问题讨论】:

ClassLibrary1 包含在 ClassLibrary3 中,因为 ClassLibrary2 需要它,所以 Class1 当然在那里可用。您只需要按照它的说明添加using ClassLibrary。您可能需要澄清您的目标是什么——您想要实现什么? 嗯,我不记得以前版本的 Visual Studio/.NET 是否这样工作。我认为必须直接引用一个项目才能使用它的元素,而不仅仅是传递引用。 我为这个问题找到了一个可能的解决方案:ardalis.com/… .NET Framework 项目不能这样工作。在 .NET Framework 中,如果 A 引用 B 和 B 引用 C,这并不意味着 A 引用 C。他们在 .NET Core 项目中更改了这一点。我不喜欢这个,因为 A 可能不想使用 C。前几天,一位同事不小心在 NuGet 包中使用了他的项目没有引用的扩展方法,该方法以Linq.Enumerable。 ReSharper 提供“在文件中导入缺少的引用”,因此同事从未看到意外的命名空间。另外,理论上,如果 C 在某处产生名称冲突,A 的构建可能会中断。 【参考方案1】:

传递项目到项目引用是 Visual Studio 2017 和 Microsoft.NET.Sdk 的新功能。这是故意的行为。

见https://github.com/dotnet/sdk/issues/200。

【讨论】:

不错。我想现在 UI 层对传统 3 层架构中数据层的依赖会更加清晰。 如果 UI 在某些时候不依赖于数据层,它应该如何访问数据?【参考方案2】:

如果你有兴趣禁用传递引用行为,我终于找到了一种方法。

如果您希望项目 A 引用 B 和 B 引用 C,但不希望 A 引用 C,您可以将 PrivateAssets="All" 添加到 B 的 ProjectReference 到 C,如下所示:

在 B.csproj 中

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

此设置将 C 的引用设为私有,因此它仅存在于 B 中。现在引用 B 的项目将不再引用 C。

来源:https://github.com/dotnet/project-system/issues/2313

【讨论】:

【参考方案3】:

你有两个选择。

    ClassLibrary1.csproj 中使用 DisableTransitiveProjectReferences 属性

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>netcoreapp3.1</TargetFramework>
            <DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
        </PropertyGroup>
        <ItemGroup>
            <ProjectReference Include="..\ClassLibraryCore2\ClassLibraryCore2.csproj" />
        </ItemGroup>
    </Project>
    

    ClassLibrary2.csproj 中使用 PrivateAssets="All"

    <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
            <TargetFramework>netcoreapp3.1</TargetFramework>
        </PropertyGroup>
        <ItemGroup>
            <ProjectReference Include="..\ClassLibraryCore3\ClassLibraryCore3.csproj" 
                PrivateAssets="All" />
        </ItemGroup>
    </Project>
    

我在其他answer 中解释了更多区别。

【讨论】:

以上是关于.Net Core 1.1 中的传递引用的主要内容,如果未能解决你的问题,请参考以下文章

显示 .NET Core 中间接引用的包中的类

如何停止 .Net Core Web API 中的自引用循环?

.Net Core 中的 Http 绑定使用带有 wcf 引用的库项目

为 ASP.NET Core 配置引用 appsettings.json 中的另一个 json 文件

.NET Core 控制台项目中的Nuget打包类库及引用

.Net Core 5 Web Api 服务对象共享和引用