Sdílet prostřednictvím


Typy middlewaru s více konstruktory

Dříve byl z kontejneru injektáže závislostí vytvořena instance middlewarového typu s více satisfiable konstruktory, použil se typ middlewaru s největším využitím parametrů. Nyní k tomu dochází pouze v případě, že kontejner injektáž závislostí implementuje IServiceProviderIsService. Pokud ne, dojde k výjimce za běhu.

Zavedená verze

.NET 9 RC 1

Předchozí chování

Dříve byl první z následujících dvou konstruktorů upřednostňovaný (pokud byly oba splněny), protože má více parametrů.

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

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

Nové chování

Počínaje rozhraním .NET 9 se preferuje žádný konstruktor a konstrukce selže s chybou, například:

System.InvalidOperationException: "Více konstruktorů, které přijímají všechny dané typy argumentů byly nalezeny v typu Microsoft.AspNetCore.CookiePolicy.CookiePolicy.CookiePolicyMiddleware". Měl by existovat pouze jeden použitelný konstruktor."

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Aktivační mechanismus byl změněn tak, aby podporoval injektáž závislostí s klíči.

Pokud k tomu dojde a nemůžete upgradovat na kontejner injektáž závislostí, který implementuje IServiceProviderIsService, můžete přidat ActivatorUtilitiesConstructorAttribute do upřednostňovaného konstruktoru ovlivněného typu middlewaru.

Ovlivněná rozhraní API

Tato změna je známo, že způsobuje chyby při vytváření instancí Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware s autofac.Extensions.DependencyInjection 7.x.