Strategy
命名空间:DesignPatterns.Behavioral
概述
按 Key 在编译期注册算法实现,避免大型 switch,选择逻辑仍由业务代码决定。
运行时
IStrategyRegistry<TKey, TStrategy>—Get/TryGetStrategyRegistryBuilder<TKey, TStrategy>— 手动注册
源生成器
- 声明 partial 静态注册表持有者。
- 在实现类上标记
[RegisterStrategy(typeof(TContract), "key")]。 - 生成器发出
{Name}Keys、Instance及可选RegisterDi。
可选标记接口:IStrategy<TIn, TOut>、IAsyncStrategy<TIn, TOut> — 生成器不强制要求。
异步解析
IAsyncStrategy 契约复用同一套 Keys / Registry / RegisterDi。StrategyRegistryExtensions 提供 ExecuteAsync / TryExecuteAsync:
csharp
public interface ITextProcessor : IAsyncStrategy<string, int> { }
// 注册表值为 IAsyncStrategy<TIn, TOut>
await registry.ExecuteAsync(key, input);
// 派生契约(显式指定 TContract、TOutput、TInput)
await registry.ExecuteAsync<ITextProcessor, int, string>(TextProcessorKeys.Length, "hello");
// 等价写法
await registry.Get(TextProcessorKeys.Length).ExecuteAsync("hello");诊断
DP003–DP007;字面量 key 见 DP025。Key 命名约定。
示例
DesignPatterns.Samples.Strategy — 同步支付策略与异步 IRefundProcessor(ExecuteAsync,见 RefundProcessors.cs)。
DI
见 依赖注入。
维护者文档:docs/Strategy.md