.NET Standard 2.0-要使用的Microsoft.Extensions.DependencyInjection.Abstractions版本

Sin*_*222 1 .net .net-core .net-standard-2.0

我创建了一个.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了引用类型“ 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应用程序。它是否正确?

Jon*_*eet 5

当创建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>
Run Code Online (Sandbox Code Playgroud)

Microsoft.AspNetCore.AppNuGet包版本2.1.11取决于Microsoft.Extensions.DependencyInjection,以“(> = 2.1.1 && <2.2.0)”的显式版本约束。

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

<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version=">= 2.2.0" />
Run Code Online (Sandbox Code Playgroud)

那么您最终会得到一个警告(而不是错误):

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.
Run Code Online (Sandbox Code Playgroud)

现在,我怀疑那很好……但是,让您的库依赖于包含所有所需功能的依赖项注入程序包的最早版本(在同一主要版本内)会更好。不幸的是,Microsoft.AspNetCore.App在此约束中具有上限-固定到特定的次要版本(IMO)并没有多大意义,因为SemVer如果2.2.0 应该与2.1.x兼容已正确遵循。尽管如此,约束仍然存在,这就是引起警告的原因。

如果(依赖注入抽象包的)2.0.0包含您需要的所有内容,我将使用它。每个ASP.NET Core Web应用程序都将使用所需的版本,大于或等于2.0.0,并且对于多个版本的ASP.NET Core来说都应该很好,而不会发出警告。