我终于删掉了那个工厂类:用 .NET 键控服务替代 Switch
来源:dev.to — 2026-08-03
📋 概述
作者在 PR 里给通知系统加 WhatsApp 渠道时,又看到了那个熟悉的身影:NotificationSenderFactory 里 switch 静默长出第四只手臂。这种“用一个接口、几个实现、一个字符串决定谁干活”的工厂类,本质是戴着工厂名牌的服务定位器。.NET 8 起内置容器的键控服务(Keyed Services)把它彻底消灭:注册时带上 key,消费端用 FromKeyedServices 属性或 GetRequiredKeyedService 按 key 解析,一个类直接删掉。
🔑 核心要点
- 工厂类的两种尴尬:要么自己 new 造成依赖扩散,要么包 IServiceProvider 沦为服务定位器,还要交注册税
- 键控服务:AddKeyedScoped(Channels.Email),映射直接写在注册里
- 运行时键解析:路由值、消息头这类运行时才定的 key,用 GetRequiredKeyedService 查询
- 两个坑:键控注册对 IEnumerable 枚举不可见;异常只报 key 的类型不报 key 本身,需在调用点记录 key
- 何时保留工厂:工厂内含真实逻辑(依赖配置、池化、构造参数)时才值得保留,否则是多余的过渡层
💡 金句
Deleting a whole class in a PR feels better than adding one. Every time.
👍 0
👎 0
← 返回 Dev.to 首页