用途:在识别出需要包装的静态依赖后,为 C# 项目生成可测试的包装接口、默认实现和依赖注入注册代码,把静态调用替换为可注入的抽象。
主要能力:按类别与目标框架选择抽象策略。时间在 .NET 8+ 用内置 TimeProvider,.NET 6-7 用 Microsoft.Bcl.TimeProvider,旧框架用自定义 ISystemClock;文件系统用 System.IO.Abstractions;HTTP 用 IHttpClientFactory;环境、控制台、进程生成自定义 IEnvironmentProvider、IConsole、IProcessRunner。自定义包装只覆盖代码中实际检测到的成员,默认实现直接委托真实静态类,不改变行为。无 DI 时可提供基于 AsyncLocal<T> 的环境上下文模式。
使用方式:先运行 detect-static-dependencies 确定要包装的静态项,再提供静态类别与 TargetFramework,可选 DI 容器(microsoft 默认、autofac、none)和命名空间。内置抽象只需按指引注册与注入,例如 builder.Services.AddSingleton(TimeProvider.System);文件系统执行 dotnet add package System.IO.Abstractions 后注册 builder.Services.AddSingleton<IFileSystem, FileSystem>();自定义包装生成接口、实现和 AddSingleton 注册片段。测试可配合 FakeTimeProvider、MockFileSystem 等测试辅助包。
适用场景:让类通过注入抽象而可测试;采用 TimeProvider 或 System.IO.Abstractions;为 Environment、Console、Process 创建自定义包装。
限制:不用于查找静态项、批量替换调用点,或静态项已在接口之后;项目不使用 DI 且不愿引入时也不适用。无状态包装用 AddSingleton,有状态用 AddTransient;环境上下文必须用 AsyncLocal<T>,避免 [ThreadStatic] 在异步下失效。