具有多个构造函数的中间件类型

以前,当从依赖项注入容器实例化具有多个可满足构造函数的中间件类型时,使用了具有最多参数的中间件类型。 现在,仅当依赖项注入容器实现 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

使用 Autofac.Extensions.DependencyInjection 7.x 实例Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware化时,已知此更改会导致错误。