1. DryIoC 容器入门指南DryIoC 是 .NET 生态中一个轻量级但功能强大的依赖注入容器它以高性能和易用性著称。作为一个从业多年的 .NET 开发者我在多个企业级项目中深度使用过 DryIoC今天就来分享这个强大工具的实战经验。与常见的 Unity、Autofac 等容器相比DryIoC 最大的特点是其极简的 API 设计和出色的运行时性能。它完全遵循 SOLID 原则特别适合需要高可维护性的大型项目。下面我将从基础用法到高级技巧带你全面掌握这个利器。2. 核心功能解析2.1 容器初始化与基本注册创建一个 DryIoC 容器非常简单var container new Container(); container.RegisterIService, Service();但实际项目中我们通常需要更多控制var container new Container(rules rules.WithTrackingDisposableTransients() // 跟踪临时对象 .WithFactorySelector(Rules.SelectLastRegisteredFactory()));这里有几个关键点需要注意WithTrackingDisposableTransients确保即使临时对象也会被正确释放SelectLastRegisteredFactory让容器总是返回最后注册的实现规则配置在容器创建时完成后续不可更改2.2 生命周期管理DryIoC 支持多种生命周期模式// 单例整个容器生命周期内唯一实例 container.RegisterISingleton, Singleton(Reuse.Singleton); // 作用域单例同一作用域内唯一 container.RegisterIScoped, Scoped(Reuse.Scoped); // 临时实例每次解析都新建 container.RegisterITransient, Transient(Reuse.Transient);实际项目中我建议默认使用 Scoped 生命周期对无状态服务使用 Transient只有真正需要全局状态时才用 Singleton2.3 构造函数注入DryIoC 默认使用构造函数注入public class Client { private readonly IService _service; public Client(IService service) { _service service; } }当有多个构造函数时DryIoC 会选择参数最多的那个。如果需要指定特定构造函数可以使用[Import]特性标记。3. 高级应用技巧3.1 装饰器模式实现DryIoC 对装饰器模式有原生支持container.RegisterIService, Service(); container.RegisterIService, ServiceDecorator(setup: Setup.Decorator);这样每次解析 IService 时实际得到的是被 ServiceDecorator 包装的实例。这在实现AOP、日志记录等横切关注点时特别有用。3.2 条件注册与解析可以根据条件动态注册服务container.RegisterIService, ServiceA(ifAlreadyRegistered: IfAlreadyRegistered.Replace); container.RegisterIService, ServiceB(ifAlreadyRegistered: IfAlreadyRegistered.Keep);解析时也可以指定条件var service container.ResolveIService(serviceKey: special);3.3 属性注入虽然构造函数注入是首选但 DryIoC 也支持属性注入public class Client { [Import] public IService Service { get; set; } } container.RegisterClient(made: PropertiesAndFields.Auto);4. 性能优化实践4.1 编译表达式树DryIoC 默认会为每个类型编译表达式树来优化解析速度var container new Container(rules rules.WithUseInterpretation());但在生产环境中应该关闭解释模式以获得最佳性能。4.2 预编译注册对于性能关键路径可以预编译注册container.RegisterIService, Service(setup: Setup.With(preventDisposal: true));这会减少运行时开销特别适合高频调用的服务。4.3 作用域管理正确使用作用域可以显著提升性能using (var scope container.OpenScope()) { var service scope.ResolveIService(); // 使用服务... } // 作用域结束时自动释放资源5. 常见问题排查5.1 循环依赖问题DryIoC 默认不支持构造函数循环依赖。解决方法使用属性注入打破循环重构设计避免循环使用 Lazy 延迟解析container.RegisterA(made: Parameters.Of.TypeB(r new LazyB(() r.ResolveB())));5.2 未注册类型异常当遇到 Unable to resolve 异常时检查类型是否已注册确认生命周期配置正确检查是否在正确的作用域内解析5.3 内存泄漏排查常见内存泄漏原因单例持有临时对象的引用未正确释放作用域事件未取消订阅可以使用容器的Validate方法检测潜在问题container.Validate();6. 实际项目集成6.1 ASP.NET Core 集成虽然 DryIoC 不是 ASP.NET Core 的默认容器但可以轻松集成public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // 将 DryIoC 适配到 ASP.NET Core return new Container().WithDependencyInjectionAdapter(services); }6.2 WPF/MVVM 应用在 WPF 中使用 DryIoC 管理 ViewModelcontainer.RegisterIViewModel, MainViewModel(); container.RegisterIView, MainWindow(); // 解析主窗口 var mainWindow container.ResolveIView(); mainWindow.Show();6.3 单元测试支持DryIoC 非常适合单元测试[Test] public void TestService() { var container new Container(); container.RegisterIService, MockService(); var client container.ResolveClient(); // 执行测试... }7. 最佳实践总结经过多个项目的实践我总结出以下经验注册顺序很重要后注册的实现会覆盖先前的慎用单例除非确实需要全局状态合理划分作用域按业务边界划分及时释放资源特别是实现了 IDisposable 的对象适度使用属性注入优先选择构造函数注入对于大型项目我建议按功能模块组织注册代码使用容器层次结构管理不同模块开发阶段开启验证生产环境关闭DryIoC 的文档相对简洁但代码库非常干净。遇到问题时直接阅读源码往往是最快的解决方式。这个项目维护活跃社区支持良好是 .NET 依赖注入的优质选择。