Thay đổi đột phá (Breaking change): Các kiểu Middleware với nhiều constructor
Trước đây, khi một kiểu middleware (phần mềm trung gian) có nhiều constructor có thể được thỏa mãn được khởi tạo từ container dependency injection (DI — tiêm phụ thuộc), constructor có nhiều tham số nhất sẽ được sử dụng. Giờ đây, điều đó chỉ xảy ra nếu container DI triển khai IServiceProviderIsService. Nếu không, một ngoại lệ (exception) sẽ được ném ra tại thời điểm chạy.
Phiên bản giới thiệu
.NET 9 RC 1
Hành vi cũ
Trước đây, constructor đầu tiên trong hai constructor sau được ưu tiên (khi cả hai đều được thỏa mãn) vì nó có nhiều tham số hơn.
public class CookiePolicyMiddleware
{
public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options, ILoggerFactory factory)
{
// ...
}
public CookiePolicyMiddleware(RequestDelegate next, IOptions<CookiePolicyOptions> options)
{
// ...
}
}Hành vi mới
Bắt đầu từ .NET 9, không constructor nào được ưu tiên, và việc khởi tạo thất bại với lỗi như:
System.InvalidOperationException: 'Multiple constructors accepting all given argument types have been found in type 'Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware'. There should only be one applicable constructor.'
Loại thay đổi đột phá
Đây là thay đổi hành vi (behavioral change).
Lý do thay đổi
Cơ chế kích hoạt (activation mechanism) đã được thay đổi để hỗ trợ keyed dependency injection (tiêm phụ thuộc có khóa).
Hành động được khuyến nghị
Nếu sự cố này xảy ra và bạn không thể nâng cấp lên container dependency injection triển khai IServiceProviderIsService, bạn có thể thêm ActivatorUtilitiesConstructorAttribute vào constructor ưa thích của kiểu middleware bị ảnh hưởng.
API bị ảnh hưởng
Thay đổi này được biết là gây ra lỗi khi khởi tạo Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware với Autofac.Extensions.DependencyInjection 7.x.