【问题标题】:.NET Standard 2.0 - Which Microsoft.Extensions.DependencyInjection.Abstractions Version to Use.NET Standard 2.0 - 使用哪个 Microsoft.Extensions.DependencyInjection.Abstractions 版本
【发布时间】:2019-06-27 17:28:09
【问题描述】:

我创建了一个 .NET Standard 2.0 类库,它有一个扩展方法,可以将服务注册添加到 IServiceCollection 实例。像这样:

using Microsoft.Extensions.DependencyInjection;

namespace Cache.Extensions
{
    public static class Extensions
    {
        public static IServiceCollection AddCacheServices(this IServiceCollection services)
        {
            services.AddTransient<IMyService, MyService>();

            return services;
        }
    }
}

为了引用“IServiceCollection”类型,系统提示我安装“Microsoft.Extensions.DependencyInjection.Abstractions”包。 2.2.0 版已安装到我的 .NET 标准库中。当我为我的库创建 NuGet 包并且用户尝试将其安装在他们的 ASP.NET Core 2.1 Web 应用程序中时,他们收到一个错误,表明他们必须使用带有版本的“Microsoft.Extensions.DependencyInjection.Abstractions”版本2.1或类似的东西。这让我想到安装的“Microsoft.Extensions.DependencyInjection.Abstractions”包的版本应该与 .NET Core 版本匹配。这个对吗?我假设 .NET 包版本应该与 .NET Core 应用程序的版本匹配。

因此,这意味着在 .NET Standard 库中使用 2.2.0 版本引用“Microsoft.Extensions.DependencyInjection.Abstractions”会阻止 2.1 版本的 .NET Core 应用程序使用该应用程序。这是正确的吗?

【问题讨论】:

  • 我将尝试重现此内容,以便更清楚发生了什么。你的 NuGet 包是公开的吗?
  • ASP.NET Core 版本无关紧要。重要的是 package 的版本。面向 ASP.NET Core 2.1 的项目将包含 2.1 版本的 Microsoft.Extensions 包。如果您自己的包需要 2.2 扩展,则 Web 应用程序也必须升级到最新版本。如果您不想强制 Web 应用更新,请使用 2.1 扩展
  • 不幸的是,它不是。我计划创建一个简单版本的包并将其安装在 2.1 和 2.2 应用程序中。我查看了一些 GitHub 项目,它们具有添加到 IServiceCollection (MediatR) 的类似包,它们引用了抽象包 2.0。我个人在 2.1 和 2.2 应用程序中都使用了 Mediatr 包,没有问题,所以我们的特定项目可能有问题。
  • 绑定重定向应该允许 Web 应用程序仅使用 Microsoft.Extensions.DependencyInjection.Abstractions 的升级版本。 Web 应用程序的开发人员可能不想这样做,或者至少在没有先测试的情况下不想这样做

标签: .net .net-core .net-standard-2.0


【解决方案1】:

当你创建一个 ASP.NET Core 2.1 Web 应用程序时,你会得到一个像这样的项目文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>

Microsoft.AspNetCore.App NuGet package version 2.1.11 依赖于 Microsoft.Extensions.DependencyInjection,具有显式版本约束“(>= 2.1.1 &&

如果您直接向以下 Web 应用程序添加依赖项:

<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version=">= 2.2.0" />

然后你会得到一个警告(而不是错误):

Detected package version outside of dependency constraint: Microsoft.AspNetCore.App 2.1.1 requires
Microsoft.Extensions.DependencyInjection.Abstractions (>= 2.1.1 && < 2.2.0)
but version Microsoft.Extensions.DependencyInjection.Abstractions 2.2.0 was resolved.

现在我怀疑这很好......但是更好让你的库依赖于最早的版本(在同一个 版本)的依赖注入包,其中包含您需要的所有功能。不幸的是,Microsoft.AspNetCore.App 在此处的约束中有一个上限 - 鉴于 2.2.0 应该兼容,固定到特定的次要版本没有多大意义 (IMO)使用 2.1.x,如果 SemVer 已正确遵循。尽管如此,约束仍然存在,这就是导致警告的原因。

如果 2.0.0(依赖注入抽象包)包含您需要的一切,我会使用它。每个 ASP.NET Core Web 应用程序都将使用它想要的版本,大于或等于 2.0.0,并且对于 ASP.NET Core 的多个版本应该一切正常,没有警告。

【讨论】:

    【解决方案2】:

    是的,我认为,这是正确的。 恕我直言,如果您使用另一个带有 .net core 2.1 或 2.2 的包,您的 NuGet-Package 不是 .Net 标准 2.0。 见这里:[在此处输入链接描述][https://docs.microsoft.com/de-de/dotnet/standard/net-standard]

    .Net 标准 2.0 也可以与 .net 框架 4.6.1 一起使用,但如果您使用的是 .net 核心包,这将无法运行。所以你的包不兼容 .net 标准。

    【讨论】:

    • Microsoft.Extensions.DependencyInjection.Abstractions 不依赖于 netcore,它依赖于 netstandard2.0。可以从另一个面向 netstandard2.0 的包中依赖它。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2017-12-29
    • 2022-06-22
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多