.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 Web API 中的自引用循环?
.Net Core 中的 Http 绑定使用带有 wcf 引用的库项目