.NET Standard 2.0 - 使用哪个 Microsoft.Extensions.DependencyInjection.Abstractions 版本

.NET Standard 2.0 - Which Microsoft.Extensions.DependencyInjection.Abstractions Version to Use

我创建了一个 .NET Standard 2.0 class 库,它有一个扩展方法,可以将服务注册添加到 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 应用程序中时,他们收到一个错误,指示他们必须使用具有 2.1 版或 2.1 版的 'Microsoft.Extensions.DependencyInjection.Abstractions' 版本沿着这些路线的东西。这让我想到安装的 'Microsoft.Extensions.DependencyInjection.Abstractions' 包的版本应该与 .NET Core 版本相匹配。这个对吗?我假设 .NET 包版本应该与 .NET Core 应用程序的版本相匹配。

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

是的,我认为这是正确的。 恕我直言,如果您使用另一个包含 .net core 2.1 或 2.2 的软件包,您的 NuGet-Package 不是 .Net standard 2.0。 请参阅此处:[在此处输入 link 描述][https://docs.microsoft.com/de-de/dotnet/standard/net-standard]

.Net standard 2.0 也可以与.net framework 4.6.1 一起使用,但是如果你使用的是.net 核心包,则不会运行。所以你的包不兼容 .net 标准。

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

<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 && < 2.2.0)”。

如果您直接将依赖项添加到以下 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.

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

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