【问题标题】:Project references in .NET Core different from previous .NET versions?.NET Core 中的项目引用与以前的 .NET 版本不同?
【发布时间】:2017-09-11 16:25:56
【问题描述】:

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

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

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

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

谁能解释一下这种行为以及如何防止它?

【问题讨论】:

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


    【解决方案1】:

    这就是您可以通过仅引用 Microsoft.AspNetCore.All 来获取所有 AspNetCore 包的方式。

    Microsoft 文档详细提到了Metapackaging。

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

    解决这个问题的一种方法是在您的 BusinessLogic 上也具有持久性抽象。并反转BusinessLogic和DataAccess的引用(高层模块不应依赖低层模块)。

    类似:

    业务逻辑:

    • User.cs
    • IUserRepository.cs

    数据访问:

    • UserRepository : IUserRepository

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

    Register<IUserRepository, UserRepository>();
    

    您可以更进一步,仅针对接口使用 DataAccess.Abstractions,但这取决于您的项目以及您想走多远。

    【讨论】:

    • 我认为在业务逻辑中拥有存储库和实体或 DAL 相关接口不是最理想的。虽然 IoC 很好,但我宁愿有适当的层分离。始终可以在 BLL 和 DAL 中创建单独的 IoC 容器。也许我在用一种老式的方式思考。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多