当前位置:首页 > C# > 正文

C#依赖注入中的装饰器顺序详解(掌握.NET Core中装饰器模式的正确注册方式)

在使用 C# 和 .NET Core 进行开发时,依赖注入(Dependency Injection, DI)是构建可维护、可测试应用程序的核心技术。而装饰器模式(Decorator Pattern)则是一种常用的设计模式,用于在不修改原始类的前提下动态地为对象添加新功能。当我们将装饰器与 C# 的依赖注入容器结合使用时,注册顺序就变得至关重要。

本文将从零开始,手把手教你如何在 .NET Core 中正确配置装饰器的依赖注入顺序,确保你的服务按预期工作。无论你是刚接触 C# 的小白,还是有一定经验的开发者,都能轻松掌握!

C#依赖注入中的装饰器顺序详解(掌握.NET Core中装饰器模式的正确注册方式) C#依赖注入 装饰器模式 .NET Core DI 服务注册顺序 第1张

什么是装饰器模式?

装饰器模式允许你通过包装对象来扩展其行为。例如,你有一个基础的日志服务,现在想在记录日志前自动添加时间戳或用户信息,就可以用装饰器来实现,而无需修改原始日志类。

C# 中如何实现装饰器?

首先,我们定义一个接口:

public interface ILoggerService{    void Log(string message);}

然后实现一个基础服务:

public class ConsoleLogger : ILoggerService{    public void Log(string message)    {        Console.WriteLine($"[LOG] {message}");    }}

接着,我们创建一个装饰器,用于添加时间戳:

public class TimestampLoggerDecorator : ILoggerService{    private readonly ILoggerService _innerLogger;    public TimestampLoggerDecorator(ILoggerService innerLogger)    {        _innerLogger = innerLogger;    }    public void Log(string message)    {        var timestampedMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}";        _innerLogger.Log(timestampedMessage);    }}

关键:装饰器的注册顺序

在 .NET Core 的依赖注入容器中,装饰器的注册顺序决定了执行顺序。你需要先注册被装饰的服务,再注册装饰器。

错误的做法(先注册装饰器)会导致解析失败或逻辑混乱:

// ❌ 错误示例services.AddScoped<TimestampLoggerDecorator>();services.AddScoped<ILoggerService, ConsoleLogger>();

正确的做法是:

// ✅ 正确示例services.AddScoped<ILoggerService, ConsoleLogger>();services.AddScoped<ILoggerService, TimestampLoggerDecorator>();

注意:虽然我们两次注册了 ILoggerService,但 .NET Core 的 DI 容器会按照后注册的覆盖前注册的原则进行解析。因此,最终注入的是 TimestampLoggerDecorator,而它内部又依赖于之前注册的 ConsoleLogger

多层装饰器的顺序控制

如果你有多个装饰器(比如还要加用户信息),顺序就更重要了:

// 假设还有一个 UserContextLoggerDecoratorservices.AddScoped<ILoggerService, ConsoleLogger>();services.AddScoped<ILoggerService, TimestampLoggerDecorator>();services.AddScoped<ILoggerService, UserContextLoggerDecorator>();

此时,调用顺序是:
UserContextLoggerDecorator → TimestampLoggerDecorator → ConsoleLogger
因为最后注册的装饰器是最外层的“包装”。

总结

在 C# 依赖注入中使用装饰器模式时,请牢记以下几点:

  • 先注册原始服务,再依次注册装饰器;
  • 后注册的装饰器会成为最外层的包装;
  • 每个装饰器必须在其构造函数中接收被装饰的接口实例;
  • 合理利用 C#依赖注入.NET Core DI 容器的覆盖机制。

掌握 服务注册顺序装饰器模式 的结合使用,能让你的代码更加灵活、解耦且易于扩展。希望这篇教程能帮助你彻底理解 C# 中依赖注入的装饰器顺序问题!

关键词回顾:C#依赖注入装饰器模式.NET Core DI服务注册顺序