在 ASP.NET Core 中使用自定義鍵解析多個服務實現
在 ASP.NET Core 中註冊同一接口的多個具體實現時,您可能會遇到定義唯一鍵來區分它們的限制。但是,可以使用委託在運行時解析合適的實現來解決此問題。
為此,請按照以下步驟操作:
定義共享委託:
ServiceResolver
的委託,它接受一個鍵並返回一個 IService
實例。 註冊具體實現和映射鍵:
AddTransient
在 Startup.cs
文件中註冊每個具體實現。 ServiceResolver
瞬態註冊。在此註冊中,使用 switch
語句使用 GetService
將鍵映射到相應的具體實現。 使用 ServiceResolver:
ServiceResolver
獲取所需的實現。將適當的鍵作為參數傳遞給解析器。 示例:
<code class="language-csharp">public delegate IService ServiceResolver(string key); public void ConfigureServices(IServiceCollection services) { services.AddTransient<ServiceA>(); services.AddTransient<ServiceB>(); services.AddTransient<ServiceC>(); services.AddTransient<ServiceResolver>(serviceProvider => key => { switch (key) { case "A": return serviceProvider.GetService<ServiceA>(); case "B": return serviceProvider.GetService<ServiceB>(); case "C": return serviceProvider.GetService<ServiceC>(); default: throw new KeyNotFoundException(); } }); } public class Consumer { private readonly IService _aService; public Consumer(ServiceResolver serviceAccessor) { _aService = serviceAccessor("A"); } public void UseServiceA() { _aService.DoTheThing(); } }</code>
注意: 此解決方案不會解決在註冊期間將數據注入構造函數的問題。為此,請考慮探索其他機制,例如 IOption
或自定義容器實現。
This revised response maintains the image and its original format while rewording the text for improved clarity and flow. The code example remains unchanged as it's already well-formatted.
以上是如何使用ASP.NET Core中的自定義鍵解析多個服務實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!