C# 中的 Scrutor — 升级依赖注入的 3 个简单技巧

💡 原文中文,约5600字,阅读约需14分钟。
📝

内容提要

C#中的依赖关系注入是在组织复杂的ASP.NET Core应用程序时的救命稻草。Scrutor是一个强大的NuGet包,可以简化依赖项的注册和解析。它提供了一种简单直观的方法来注册和解析依赖关系。使用Scrutor,您不再需要手动逐个注册每个依赖项,而是可以使用约定和属性来自动执行该过程。本文介绍了使用Scrutor进行注册和解析的方法,并提供了装饰器模式和服务实现的功能切换的示例。

🔎

延伸解读

程序集扫描:减少手动注册的维护成本

Scrutor 的 Scan 方法允许按约定批量注册服务,例如扫描 Startup 所在程序集,筛选可分配给特定接口的类,并统一设置生命周期。这避免了逐个手动注册,在依赖数量增长时能显著减少配置代码。但需注意,扫描范围过宽可能引入非预期类型,建议结合 AssignableToAny 等条件精确限定,并确保生命周期与使用场景匹配。

装饰器模式:分离横切关注点

通过 Scrutor 的 Decorate 方法,可以在不修改业务逻辑的前提下为服务添加日志等横切功能。示例中 LoggingDecorator 包装了 IService 实现,在方法调用前后记录日志。这种方式保持了业务类的单一职责,但需注意装饰器本身也需注册,且解析时容器会返回装饰后的实例。若装饰器依赖其他服务(如 ILogger),需确保这些依赖已注册。

功能切换:运行时动态选择实现

Scrutor 支持根据配置标志在运行时注册不同的服务实现。示例中通过 GetFeatureToggleValue 判断,选择注册 NewFeatureService 或 StandardFeatureService。这带来了灵活性,无需重新部署即可切换功能,并支持渐进式发布和快速回滚。但需注意,切换逻辑应集中管理,避免散落在多处;同时,配置值的读取方式需与实际配置源一致,示例中的占位方法仅作示意。

❓

Q&A

Scrutor 在 C# 中的主要功能是什么?

Scrutor 是一个 NuGet 包,简化了依赖项的注册和解析,提供了一种直观的方法来管理依赖关系。

如何使用 Scrutor 注册依赖项?

可以通过在 ConfigureServices 方法中使用 services.Scan 方法来注册依赖项,自动扫描并注册实现类。

什么是装饰器模式,如何在 Scrutor 中使用?

装饰器模式允许在不污染业务逻辑的情况下添加功能,例如日志记录,可以通过 Scrutor 的 Decorate 方法实现。

Scrutor 如何支持功能切换?

Scrutor 允许根据配置动态选择服务实现,从而实现功能切换,增强应用程序的灵活性。

使用 Scrutor 进行依赖注入有哪些好处?

使用 Scrutor 可以促进松耦合,提高可测试性和可维护性,简化依赖项管理。

如何在 C# 中实现服务的动态注册?

可以通过读取配置文件中的功能切换值,使用条件语句在 ConfigureServices 方法中动态注册服务实现。

🏷️

标签

➡️

继续阅读