前言
.NET 的內建 DI 容器有一個長年的限制:一個介面對應多個實作時,沒辦法「指定要哪一個」。
services.AddScoped<IPaymentProvider, EcPayProvider>();
services.AddScoped<IPaymentProvider, NewebPayProvider>();
// 建構子注入 IPaymentProvider 時,只會拿到「最後註冊的那個」(NewebPayProvider)
在 .NET 8 之前,遇到這種需求只能繞路:注入 IEnumerable<T> 自己篩選、或自己寫工廠類別。
.NET 8 的 Microsoft.Extensions.DependencyInjection 終於內建了具名注入(Keyed Services):
註冊時給每個實作一個 key,取用時憑 key 拿到指定的實作。
這篇整理它的基本用法、相較舊做法的優點,以及兩個我覺得最常用到的場景:
各家金流提供者、同介面的不同儲存策略。