依赖注入(DI)是一种软件设计模式,旨在实现控制反转(IoC),以降低类之间的耦合度。在.NET生态中,Microsoft.Extensions.DependencyInjection
是官方提供的一个轻量级的依赖注入容器。本文将详细介绍如何在C#中使用这个库,并通过多个场景提供具体的示例。
在深入例子之前,我们先回顾一下几个关键概念:
首先,需要在项目中安装Microsoft.Extensions.DependencyInjection
库:
dotnet add package Microsoft.Extensions.DependencyInjection
服务注册通常在应用程序启动时进行。以下是注册服务的基本步骤:
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方法注册了这些服务。
在注册服务时,可以指定服务的生命周期:
注册服务后,可以通过ServiceProvider
的GetService
方法来解析服务。
依赖注入最常见的方式是通过构造函数注入。
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!");
}
有时候服务的创建可能需要一些复杂的逻辑,这时可以通过工厂模式来注册服务。
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!");
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!