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

时间:2019-06-27 02:54:11

标签: .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;
        }
    }
}

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

2 个答案:

答案 0 :(得分: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>

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 应该兼容,将其固定到特定的次要版本没有太大意义(IMO)如果已正确遵循SemVer,请使用2.1.x。仍然存在约束,这就是引起警告的原因。

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

答案 1 :(得分:0)

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

.Net标准2.0也可以与.net Framework 4.6.1一起使用,但是如果使用.net核心程序包,则该程序将无法运行。因此您的软件包与.net标准不兼容。