编辑
2025-09-27
C#
00

目录

摘要
正文
基础概念
安装
服务注册
服务生命周期
服务解析
场景一:构造函数注入
场景二:使用工厂模式

摘要


依赖注入(DI)是一种软件设计模式,旨在实现控制反转(IoC),以降低类之间的耦合度。在.NET生态中,Microsoft.Extensions.DependencyInjection是官方提供的一个轻量级的依赖注入容器。本文将详细介绍如何在C#中使用这个库,并通过多个场景提供具体的示例。

正文


基础概念

在深入例子之前,我们先回顾一下几个关键概念:

  • 服务(Service):通常是一个接口或抽象类,定义了一系列方法,它们可以执行特定的功能。
  • 服务实现者(Service Implementation):实现了服务的具体类。
  • 服务容器(Service Container):存储服务类型和对应实现的容器。
  • 服务注册(Service Registration):将服务及其实现类添加到服务容器的过程。
  • 服务解析(Service Resolution):从服务容器中获取服务实例的过程。

安装

首先,需要在项目中安装Microsoft.Extensions.DependencyInjection库:

dotnet add package Microsoft.Extensions.DependencyInjection

image.png

服务注册

服务注册通常在应用程序启动时进行。以下是注册服务的基本步骤:

C#
using Microsoft.Extensions.DependencyInjection; using System; public interface IMessageSender { void Send(string message); } public class EmailSender : IMessageSender { public void Send(string message) { Console.WriteLine($"Sending Email: {message}"); } } public class SmsSender : IMessageSender { public void Send(string message) { Console.WriteLine($"Sending SMS: {message}"); } } class Program { static void Main(string[] args) { // 创建服务容器的实例 var services = new ServiceCollection(); // 注册服务 services.AddTransient<IMessageSender, EmailSender>(); // 临时服务 services.AddSingleton<SmsSender>(); // 单例服务 // 构建服务提供者 var serviceProvider = services.BuildServiceProvider(); // 使用服务 var emailSender = serviceProvider.GetService<IMessageSender>(); emailSender.Send("Hello via Email!"); var smsSender = serviceProvider.GetService<SmsSender>(); smsSender.Send("Hello via SMS!"); } }

IMessageSender是一个服务接口,EmailSender和SmsSender是它的两个实现。我们通过ServiceCollection的AddTransient和AddSingleton方法注册了这些服务。

服务生命周期

在注册服务时,可以指定服务的生命周期:

  • Transient:每次请求时都会创建一个新的实例。
  • Scoped:在一个请求范围内共享一个实例。
  • Singleton:整个应用程序生命周期内只创建一个实例。

服务解析

注册服务后,可以通过ServiceProviderGetService方法来解析服务。

场景一:构造函数注入

依赖注入最常见的方式是通过构造函数注入。

C#
public class NotificationService { private readonly IMessageSender _messageSender; public NotificationService(IMessageSender messageSender) { _messageSender = messageSender; } public void Notify(string message) { _messageSender.Send(message); } }
C#
static void Main(string[] args) { // 创建服务容器的实例 var services = new ServiceCollection(); // 注册服务 services.AddTransient<IMessageSender, EmailSender>(); services.AddTransient<NotificationService>(); // 构建服务提供者 var serviceProvider = services.BuildServiceProvider(); // 解析服务 var notificationService = serviceProvider.GetService<NotificationService>(); notificationService.Notify("You've got mail!"); }

image.png

场景二:使用工厂模式

有时候服务的创建可能需要一些复杂的逻辑,这时可以通过工厂模式来注册服务。

C#
static void Main(string[] args) { // 创建服务容器的实例 var services = new ServiceCollection(); // 注册服务 services.AddTransient<IMessageSender>(provider => { // 设置应用程序的基目录,通常是项目的根目录 var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: t // 构建配置 IConfiguration configuration = builder.Build(); var useSms = configuration.GetValue<bool>("UseSms"); return useSms ? new SmsSender() : (IMessageSender)new EmailSender(); }); // 构建服务提供者 var serviceProvider = services.BuildServiceProvider(); // 使用服务,这里根据UseSms判断使用具体的Sender var sender = serviceProvider.GetService<IMessageSender>(); sender.Send("Hello via Email!"); }

image.png

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!