.NET Standard 2.0 - какую версию Microsoft.Extensions.DependencyInjection.Abstractions использовать - PullRequest
1 голос
/ 27 июня 2019

Я создал библиотеку классов .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, он получил сообщение об ошибке, указывающее на необходимость использования версии «Microsoft.Extensions.DependencyInjection.Abstractions» с версией. 2.1 или что-то в этом роде. Это заставило меня задуматься о том, что версия установленного пакета Microsoft.Extensions.DependencyInjection.Abstractions должна соответствовать версии .NET Core. Это правильно? Я предполагал, что версии пакета .NET должны соответствовать версии приложения .NET Core.

Таким образом, это означает, что ссылка на «Microsoft.Extensions.DependencyInjection.Abstractions» с версией 2.2.0 в библиотеке .NET Standard не позволяет приложениям .NET Core версии 2.1 использовать приложение. Это правильно?

Ответы [ 2 ]

5 голосов
/ 27 июня 2019

При создании веб-приложения 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 2.1.11 зависит отMicrosoft.Extensions.DependencyInjection, с явным ограничением версии "(> = 2.1.1 && <2.2.0)". </p>

Если вы добавляете зависимость непосредственно в веб-приложение:

<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 имеет здесь верхнюю границу ограничения - не имеет особого смысла (IMO) привязывать к определенной вспомогательной версии, учитывая, что 2.2.0 должна быть совместимой с2.1.x, если SemVer соблюден должным образом.Тем не менее, ограничение есть, и именно это вызывает предупреждение.

Если 2.0.0 (из пакета абстракции внедрения зависимостей) содержит все, что вам нужно, я бы просто использовал это.Каждое веб-приложение ASP.NET Core будет использовать требуемую версию, большую или равную 2.0.0, и все должно быть хорошо для нескольких версий ASP.NET Core без предупреждений.

0 голосов
/ 27 июня 2019

да, я думаю, это правильно.ИМХО, ваш NuGet-пакет не соответствует стандарту .Net 2.0, если вы используете другой пакет с .net core 2.1 или 2.2.Смотрите здесь: [введите описание ссылки здесь] [https://docs.microsoft.com/de-de/dotnet/standard/net-standard]

.Net standard 2.0 также можно использовать с .net framework 4.6.1, но если вы используете основной пакет .net, он не запустится.Таким образом, ваш пакет не совместим со стандартом .net.

...