在使用 C# 和 .NET Core 进行开发时,依赖注入(Dependency Injection, DI)是构建可维护、可测试应用程序的核心技术。而装饰器模式(Decorator Pattern)则是一种常用的设计模式,用于在不修改原始类的前提下动态地为对象添加新功能。当我们将装饰器与 C# 的依赖注入容器结合使用时,注册顺序就变得至关重要。
本文将从零开始,手把手教你如何在 .NET Core 中正确配置装饰器的依赖注入顺序,确保你的服务按预期工作。无论你是刚接触 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、服务注册顺序。
本文由主机测评网于2025-12-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212168.html