Поделиться через


Типы ПО промежуточного слоя с несколькими конструкторами

Ранее, когда тип ПО промежуточного слоя с несколькими удостоверяемыми конструкторами был создан из контейнера внедрения зависимостей, используется один с наибольшим набором параметров. Теперь это происходит только в том случае, если контейнер внедрения зависимостей реализует IServiceProviderIsService. Если это не так, исключение создается во время выполнения.

Представленные версии

.NET 9 RC 1

Прежнее поведение

Ранее первый из следующих двух конструкторов предпочтительнее (если оба были удовлетворены), так как он имеет больше параметров.

public class CookiePolicyMiddleware
{
    public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options, ILoggerFactory factory)
    {
        // ...
    }

    public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options)
    {
        // ...
    }
}

Новое поведение

Начиная с .NET 9, ни предпочтительным конструктором не является, и построение завершается ошибкой, например:

System.InvalidOperationException: "Несколько конструкторов, принимающие все указанные типы аргументов, найдены в типе Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware". Должен быть только один применимый конструктор.

Тип критического изменения

Это изменение поведения.

Причина изменения

Механизм активации был изменен для поддержки внедрения ключевых зависимостей.

Если это произойдет, и вы не можете обновить контейнер внедрения зависимостей, который реализует IServiceProviderIsService, можно добавить ActivatorUtilitiesConstructorAttribute в предпочтительный конструктор затронутого типа ПО промежуточного слоя.

Затронутые API

Это изменение, как известно, вызывает ошибки при создании экземпляра Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware с помощью Autofac.Extensions.DependencyInjection 7.x.