.NET Core中的项目引用与以前的.NET版本不同吗?

时间:2017-09-11 16:25:57

标签: c# visual-studio architecture .net-core

目前使用C#和dotnet Core设置新的Web Api。我在引用其他项目时会注意到一些奇怪的行为。

我的解决方案非常简单:DataAccess,BusinessLogic,WebApi

WebApi项目引用了BusinessLogic项目,BusinessLogic项目引用了DataAccess项目。

现在使用以前版本的.NET,我的WebApi项目无法访问DataAccess项目中的任何内容,但在我当前的设置中,我可以访问WebApi项目中的DataAccess项目,而无需引用它。

有人可以解释一下这种行为以及可能的预防措施吗?

2 个答案:

答案 0 :(得分:2)

这就是通过引用Microsoft.AspNetCore.All来获取所有AspNetCore包的方法。

Microsoft文档详细提及Metapackaging

另请注意,由于应用程序的组合根是WebAPI,因此您希望它查看来自DataAccess的类型,以便您可以使用容器注册它们。

另一种方法是在您的BusinessLogic上使用持久性抽象。并反转BusinessLogic和DataAccess的引用(高级模块不应依赖于低级模块)。

类似的东西:

BusinessLogic:

  • User.cs
  • IUserRepository.cs

数据访问:

  • UserRepository:IUserRepository

现在,WebAPI项目可以引用DataAccess和BusinessLogic并注册容器:

Register<IUserRepository, UserRepository>();

你可以更进一步,只为接口提供DataAccess.Abstractions,但这取决于你的项目以及你想走多远。

答案 1 :(得分:0)

找到了一种防止此线程中此行为的方法:Disable transitive project reference in .NET Standard 2

编辑项目文件时,可以将PrivateAssets属性设置为All,以防止此行为。

  <ItemGroup>
    <ProjectReference Include="..\DataAccess\1-DataAccess.csproj" PrivateAssets="All" />
  </ItemGroup>