<C#>在 .NET 開發中,依賴注入, 注冊一個接口的多個實現

在 .NET 開發里,有時一個接口會有多個實現類,此時就需要向依賴注入容器注冊多個實現。下面會詳細介紹不同場景下如何注冊多個實現,以及怎樣從容器中解析這些實現。

1. 注冊多個實現

在 .NET 中,依賴注入容器可以通過不同方式注冊同一接口的多個實現。

1.1 以列表形式注冊

你可以把同一接口的多個實現添加到一個列表中,然后將這個列表注冊到依賴注入容器。

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;// 定義接口
public interface IMessageSender
{void SendMessage(string message);
}// 實現類1
public class EmailSender : IMessageSender
{public void SendMessage(string message){Console.WriteLine($"Sending email: {message}");}
}// 實現類2
public class SmsSender : IMessageSender
{public void SendMessage(string message){Console.WriteLine($"Sending SMS: {message}");}
}class Program
{static void Main(){var services = new ServiceCollection();// 注冊多個實現services.AddTransient<IMessageSender, EmailSender>();services.AddTransient<IMessageSender, SmsSender>();var serviceProvider = services.BuildServiceProvider();// 解析所有實現var messageSenders = serviceProvider.GetServices<IMessageSender>();foreach (var sender in messageSenders){sender.SendMessage("Hello, World!");}}
}

在上述代碼中,EmailSender?和?SmsSender?都實現了?IMessageSender?接口。通過多次調用?AddTransient?方法,將這兩個實現類注冊到了依賴注入容器。最后,使用?GetServices<IMessageSender>()?方法可以獲取所有實現該接口的實例。

1.2 按名稱或鍵注冊

如果你想根據名稱或鍵來區分不同的實現,可以自定義一個字典來管理這些實現。

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;// 定義接口
public interface IMessageSender
{void SendMessage(string message);
}// 實現類1
public class EmailSender : IMessageSender
{public void SendMessage(string message){Console.WriteLine($"Sending email: {message}");}
}// 實現類2
public class SmsSender : IMessageSender
{public void SendMessage(string message){Console.WriteLine($"Sending SMS: {message}");}
}class MessageSenderFactory
{private readonly Dictionary<string, Func<IMessageSender>> _senders;public MessageSenderFactory(IServiceProvider serviceProvider){_senders = new Dictionary<string, Func<IMessageSender>>{{ "Email", () => serviceProvider.GetRequiredService<EmailSender>() },{ "Sms", () => serviceProvider.GetRequiredService<SmsSender>() }};}public IMessageSender GetSender(string name){if (_senders.TryGetValue(name, out var factory)){return factory();}throw new ArgumentException($"No sender found with name: {name}");}
}class Program
{static void Main(){var services = new ServiceCollection();services.AddTransient<IMessageSender, EmailSender>();services.AddTransient<IMessageSender, SmsSender>();services.AddTransient<MessageSenderFactory>();var serviceProvider = services.BuildServiceProvider();var factory = serviceProvider.GetRequiredService<MessageSenderFactory>();var emailSender = factory.GetSender("Email");emailSender.SendMessage("Hello via email!");var smsSender = factory.GetSender("Sms");smsSender.SendMessage("Hello via SMS!");}
}

在這個例子中,MessageSenderFactory?類負責根據名稱來獲取不同的?IMessageSender?實現。通過在構造函數中初始化一個字典,將名稱與對應的實現關聯起來。

2. 解析多個實現

  • 獲取所有實現:使用?GetServices<T>()?方法可以獲取注冊到容器中的所有?T?類型的實現。如前面第一個示例所示,serviceProvider.GetServices<IMessageSender>()?會返回一個包含所有?IMessageSender?實現的集合。
  • 按名稱或鍵解析:借助自定義的工廠類(如?MessageSenderFactory),可以根據名稱或鍵來獲取特定的實現。

3. 應用場景

  • 插件系統:在插件系統里,不同的插件可能實現了同一個接口。通過注冊多個實現,可以方便地管理和使用這些插件。
  • 多渠道消息發送:就像前面的示例,應用程序可能需要通過不同的渠道(如郵件、短信)發送消息,每個渠道對應一個實現類。

總結

在 .NET 開發中,為同一接口注冊多個實現是可行的,并且有多種方式可供選擇。你可以將多個實現以列表形式注冊,也可以按名稱或鍵進行注冊。通過不同的解析方式,能夠根據需求獲取特定的實現。這樣可以提高代碼的靈活性和可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76945.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea 保存格式化 但是不格式化 Xml

xml- 其他 - 保持空格勾選上 https://blog.csdn.net/m0_65724734/article/details/128378290?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-128378290-blog-135147277.235%5Ev43%5Epc_blog_bo…

如何在C++中優雅地繪制圖表

如何在C項目中優雅地繪制圖表 matplotlibpreparematplotlibcpp.hpython3vs configuretest Gnuplotpreparegnuplotgnuplot-iostream.hboostvs configuretest MathGL 在C項目中&#xff0c;在進行一些數據分析時往往不夠直觀&#xff0c;若能借助圖表進行分析可以達到事半功倍的效…

vue3使用keep-alive緩存組件與踩坑日記

目錄 一.了解一下KeepAlive 二.使用keep-alive標簽緩存組件 1.聲明Home頁面名稱 三.在路由出口使用keep-alive標簽 四.踩坑點1&#xff1a;可能需要配置路由&#xff08;第三點完成后有效可忽略&#xff09; 五.踩坑點2&#xff1a;沒有找到正確的路由出口 一.了解一下Kee…

ros通信機制學習——latched持久化機制

點云的地圖的發送邏輯中&#xff0c;我發現每次使用rostopic echo 時只會打印一次&#xff0c;然后就不會再打印了。并且rviz中也是始終都會顯示的&#xff0c;這里面其實就是用到了latched持久話機制&#xff0c;可以接受這最后一次發布的消息。 我們通過一個具體的項目來學習…

力扣每日打卡 1922. 統計好數字的數目 (中等)

力扣 1922. 統計好數字的數目 中等 前言一、題目內容二、解題方法1. 暴力解法&#xff08;會超時&#xff0c;此法不通&#xff09;2. 快速冪運算3. 組合計數的思維邏輯分析組合計數的推導例子分析思維小結論 4.官方題解4.1 方法一&#xff1a;快速冪 三、快速冪運算快速冪運算…

如何使用通義靈碼玩轉Docker - AI助手提升開發效率

一、引言 Docker 作為一種流行的虛擬化技術&#xff0c;能夠幫助開發者快速搭建所需的運行環境。然而&#xff0c;對于初學者來說&#xff0c;掌握 Docker 的基本概念和使用方法可能會遇到一些挑戰。本文將介紹如何利用通義靈碼這一智能編碼助手&#xff0c;幫助你更高效地學習…

從一到無窮大 #45:InfluxDB MCP Server 構建:從工程實踐到價值重構

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 工程實踐遇到的問題MCP Host選擇開發流程 結果展現可能性展望工作生活帶來的變化 MCP…

JAVA SDK通過proxy對接google: GCS/FCM

前言&#xff1a;因為國內調用google相關api需要通過代理訪問(不想設置全局代理)&#xff0c;所以在代理這里經常遇到問題&#xff0c;先說一下結論 GCS 需要設置全局代理或自定義代理選擇器&#xff0c; FCM sdk admin 在初始化firebaseApp時是支持設置的。 GCS: 開始時嘗試在…

【NLP】24. spaCy 教程:自然語言處理核心操作指南(進階)

spaCy 中文教程&#xff1a;自然語言處理核心操作指南&#xff08;進階&#xff09; 1. 識別文本中帶有“百分號”的數字 import spacy# 創建一個空的英文語言模型 nlp spacy.blank("en")# 處理輸入文本 doc nlp("In 1990, more than 60% of people in East…

關于香橙派OrangePi 5 Ultra 這個開源板子,開發Android

我下載了它資料中的開源Android13 系統SDK&#xff0c; 這個SDK連個git 都沒有&#xff0c;把這種代碼釋放能稱為開源嗎&#xff1f;&#xff1f; 并且也就是說你買了這個板子&#xff0c;里面是沒有任何關于RK3588的開發文檔&#xff0c;如果你沒玩過其他RK平臺&#xff0c;估…

WHAT - React Portal 機制:將子組件渲染到 DOM 的指定節點

文章目錄 適合場景基本語法示例&#xff1a;Modal 彈窗1. 創建一個簡單的 Modal.tsx2. 在 App 中使用 為什么要用 Portal&#xff1f;TypeScript 中 Portal 類型定義&#xff1f; 適合場景 React Portal 是 React 提供的一種機制&#xff0c;讓你可以將子組件渲染到 DOM 的指定…

數據結構---跳表

目錄 一、跳表的概念 為什么要使用隨機值來確定層高 二、跳表的分析 &#xff08;1&#xff09;查找過程 &#xff08;2&#xff09;性能分析 三、跳表的實現 四、與紅黑樹哈希表的對比 skiplist本質上也是一種查找結構&#xff0c;用于解決算法中的查找問題&#xff0c…

PCDN通過個人路由器,用更靠近用戶的節點來分發內容,從而達到更快地網絡反應速度

PCDN&#xff08;P2P CDN&#xff09;的核心思想正是利用個人路由器、家庭寬帶設備等分布式邊緣節點&#xff0c;通過就近分發內容來降低延遲、提升網絡響應速度&#xff0c;同時降低傳統CDN的帶寬成本。以下是其技術原理和優勢的詳細分析&#xff1a; 1. 為什么PCDN能更快&…

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰極客亮相QCon2025鴻蒙專場,解析FinClip“技術+生態”雙引擎

2025年4月10日&#xff0c;備受矚目的QCon開發者技術峰會盛大舉行&#xff0c;本次活動開設鴻蒙專場以“HarmonyOS NEXT 創新特性與行業實踐”為主題&#xff0c;匯聚了眾多鴻蒙生態的領軍人物與技術專家&#xff0c;共同探討鴻蒙操作系統的技術創新與行業應用。 凡泰極客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 詳解 1. HttpServletRequest&#xff08;HTTP 請求對象&#xff09; HttpServletRequest 是 Java Servlet API 提供的接口&#xff0c;用于封裝客戶端的 HTTP 請求信息。它繼承自 ServletRequest&#xff0c;并增加了 HTTP 協議相…

HAL TIM PWM產生 藍橋杯

目錄 0.原理 0.1 CNT和CCR關系 0.2 PWM模式1模式2 1. cubemx配置 需求(將PA1輸出1Khz的 50&#xff05;占空比的方波) 1.0 PWM的頻率計算: 2.代碼 0.原理 0.1 CNT和CCR關系 CNT計數器和CCR比較器進行比較,如果是向上計數,CNT逐漸增加,CCR是虛線位置,也是用戶自定義的…

python入門:簡單介紹和python和pycharm軟件安裝/學習網址/pycharm設置(改成中文界面,主題,新建文件)

Python 目前是 AI 開發的首選語言 軟件安裝 python解釋器 官網下載 Python |Python.org 勾選 Add python.exe to PATH 將python.exe添加到PATH 勾選這個選項會將Python的可執行文件路徑添加到系統的環境變量PATH中。這樣做的好處是&#xff0c;你可以在命令行中從任何位置直…

CMD命令行筆記

CMD命令行筆記&#xff0c;涵蓋常用命令及實用技巧&#xff0c;適合快速查閱&#xff1a; 一、基礎操作 打開CMD Win R → 輸入 cmd → 回車管理員模式&#xff1a;右鍵開始菜單 → 選擇“命令提示符&#xff08;管理員&#xff09;” 常用命令 help&#xff1a;查看所有命令…

android中dp和px的關系

關于android的dp和px的關系是我剛開始學習android的第一個知識點&#xff0c;不知不覺學安卓也有一年了&#xff0c;但是偶然間我發現我理解的dp和px的關系一直是錯的&#xff0c;真的是有一點搞笑&#xff0c;今天特意寫一篇博客紀念一下這個我理解錯一年的知識點。 dp和px之間…