C#怎么实现策略模式_C# Strategy设计模式实现方法教程【技巧】
策略模式的核心是使接口足够窄且具体,避免空接口导致行为无约束。应按输入输出边界定义接口,明确同步/异步、参数验证及错误处理。注册策略集合宜用依赖注入配合元数据标记,解析时使用GetServices。需注意DI配置完整性,避免横切逻辑混入策略中。
聊到策略模式,很多人第一反应就是拿一堆 if-else 配上接口硬凑,结果代码越写越臃肿。其实核心就一句话:让策略契约足够窄、足够具体。否则你很快就会陷入“这个策略要传 IDictionary,那个要 CancellationToken,第三个还得返回 Task”的泥潭——最后只能用泛型堆砌或 object 强转,反而更难维护。

策略接口别写成空壳 IStrategy
空接口最大的问题是没有任何行为约束——后续全靠注释和人肉约定。新加一个策略类时,没人知道它该接受什么输入、返回什么结果、是否异步、要不要重试。一上线就崩,太常见了。
- 按输入输出边界定义接口,比如
IChargeProcessor,而不是笼统的IPaymentStrategy。这样每个策略的职责一眼就能看清。 - 接口方法必须明确:是同步还是异步?参数要不要做验证?失败时抛异常还是返回错误码?这些细节定下来,后面的人就不会乱来。
- 避免在接口里塞横切逻辑(日志、缓存、重试)——这些该由装饰器或中间件统一处理,混进策略里只会让测试和复用变得痛苦。
.NET 6+ 注册策略集合别手写 Dictionary
手动维护字典看似简单,但一接入多租户、插件热加载或需要生命周期管理(比如 Scoped 策略),立刻就出问题:服务没注册、Key 写错没提示、作用域错乱、重复注册——调试起来头大。
- 注册用
AddTransient,配合() [StrategyName("alipay")]这类元数据标记,比字符串 Key 更安全,编译阶段就能发现问题。 - 解析时别直接
GetService,要用() GetServices拿全部,再按需筛选。这样扩展新策略时不用改任何注册代码。() - 如果策略依赖
IServiceScope(比如要访问 Scoped 服务),确保调用方自己创建 scope,别在策略内部 new 一个 scope 出来——否则生命周期管理就失控了。
报 InvalidOperationException: No service for type 'X' has been registered 怎么快速定位
这个错误其实不是策略类写错了,而是 DI 配置断在某一层。要么策略本身没注册,要么它依赖的某个服务(比如 IHttpClientFactory 或 IOptions)漏注册,或者生命周期不匹配(比如 Transient 策略注入了 Singleton 服务,而该服务又依赖 Scoped 服务——这种连环坑很隐蔽)。
- 从报错策略类开始,逐个检查构造函数参数,确认每个类型都在
Program.cs里显式注册过。别偷懒用隐式注册,显式注册一目了然。 - 特别注意
IOptions、IConfiguration这类“看起来自带”的服务——很多人以为它们默认可用,其实必须显式调用AddOptions或() Configure。() - 用
ServiceProvider.GetService打印所有已注册策略,检查有没有漏掉的实现类。这个方法比猜快得多。>()
策略最难的从来不是写几个类,而是划清边界:哪些该进策略、哪些该由上下文传入、哪些该交给中间件兜底。一旦把“共享 HttpClient”“读配置”“记录耗时”全塞进策略执行方法里,策略就不再是策略,而是大杂烩——维护成本翻倍,谁也救不了。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













