我正在使用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中的一个新“功能”,但我该如何解决?
答案 0 :(得分:10)
传递项目引用是.NET Core / .NET> = 5中使用的SDK样式csproj(1,2)格式的新功能。对于旧的.NET,也可以使用此csproj框架项目(1,2,3),但有一些exceptions。
在这种SDK样式格式中,项目引用(由.csproj文件中的<ProjectReference>
条目表示)是可传递的。这与以前使用的旧的非SDK .csproj不同。
但是您有两种选择可以返回到旧的非传递性行为。
在.csproj中使用<DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
属性,该属性引用了您不希望其传递依赖项被编译器可见的项目。
您可以将其添加到 Web 项目中。 (引用其他项目的第一个项目, Web -> 服务-> 业务)
您还可以通过在包含源的根文件夹中的Directory.Build.props文件中对所有.csprojs全局设置此行为。
<Project>
<PropertyGroup>
<DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
</PropertyGroup>
</Project>
使用此文件,您基本上具有旧的项目参考行为。当您将使用旧csproj格式的旧.NET Framework解决方案迁移到新的SDK样式的.csprojs时很有用。
在您引用的项目上,您可以设置在引用该项目时不应进一步依赖哪些依赖项。为此,请在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>