首頁 > 後端開發 > C++ > 如何在ASP.NET核心依賴注入中使用唯一的鍵註冊和解析多個接口實現?

如何在ASP.NET核心依賴注入中使用唯一的鍵註冊和解析多個接口實現?

Susan Sarandon
發布: 2025-01-29 21:31:09
原創
385 人瀏覽過

How Can I Register and Resolve Multiple Interface Implementations with Unique Keys in ASP.NET Core Dependency Injection?

在ASP.NET Core中註冊和解析多個接口實現

問題陳述

在使用實現相同接口的服務時,基於唯一鍵註冊和解析它們可能是一個挑戰。與允許使用鍵來區分具體實現的其他IoC容器不同,ASP.NET Core的默認DI系統在這方面似乎受到限制。

解決方案:使用Func委託

為了克服這個限制,可以通過使用ServiceResolver類型的共享委託作為一種變通方案來實現,該委託將鍵作為參數並返回所需服務的實例。

<code class="language-csharp">public delegate IService ServiceResolver(string key);</code>
登入後複製

Startup.cs文件中,使用ServiceResolver註冊瞬態服務和類型的映射:

<code class="language-csharp">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();
    }
});</code>
登入後複製

在任何使用DI注入的類中,都可以使用ServiceResolver來獲取所需的Service:

<code class="language-csharp">public class Consumer
{
    private readonly IService _aService;

    public Consumer(ServiceResolver serviceAccessor)
    {
        _aService = serviceAccessor("A");
    }

    public void UseServiceA()
    {
        _aService.DoTheThing();
    }
}</code>
登入後複製

注意:此方法出於簡化目的使用字符串鍵,但如果需要,可以使用任何自定義解析類型作為鍵。

其他注意事項

雖然此解決方案解決了基於鍵註冊和解析多個接口實現的問題,但需要注意以下幾點:

  • 此解決方案涉及手動映射,如果維護不當,可能會容易出錯。
  • 它沒有解決在註冊期間將靜態數據注入構造函數的問題。為此,請考慮使用選項模式或其他技術。

以上是如何在ASP.NET核心依賴注入中使用唯一的鍵註冊和解析多個接口實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板