如何实现MS Dependency Injection与Castle Windsor兼容共用?
MS DI 与 Castle Windsor 共存方案
完全可以实现两种容器共同使用,不需要全量迁移现有基于Castle Windsor的业务代码,核心原则是最小化MS DI的使用范围,仅用它完成第三方库要求的注册,再通过桥接逻辑把MS DI中的服务接入Windsor容器,让现有业务代码无感知调用。
具体实现步骤
- 独立初始化MS DI的服务集合
不要修改现有Windsor容器的启动注册逻辑,单独实例化一个ServiceCollection对象,仅按照第三方库的要求调用它提供的AddXXX扩展方法完成注册,不需要将现有业务服务注册到这个集合中。
参考代码:var msServiceCollection = new ServiceCollection(); // 调用第三方库提供的MS DI扩展方法完成专属注册 msServiceCollection.AddThirdPartyRequiredServices(); - 桥接MS DI服务到Castle Windsor
构建MS DI的服务提供器后,遍历所有在MS DI中注册的服务描述,按照生命周期对齐的规则,将服务解析逻辑转发给MS DI,统一注册到Windsor容器中:- MS DI的Singleton生命周期对应Windsor的Singleton生命周期
- MS DI的Scoped生命周期对应Windsor的Scoped生命周期
- MS DI的Transient生命周期对应Windsor的Transient生命周期
参考实现代码:
var msServiceProvider = msServiceCollection.BuildServiceProvider(); foreach (var serviceDesc in msServiceCollection) { var reg = Component.For(serviceDesc.ServiceType) .UsingFactoryMethod(_ => msServiceProvider.GetService(serviceDesc.ServiceType)); reg = serviceDesc.Lifetime switch { ServiceLifetime.Singleton => reg.LifestyleSingleton(), ServiceLifetime.Scoped => reg.LifestyleScoped(), ServiceLifetime.Transient => reg.LifestyleTransient(), _ => throw new InvalidOperationException($"未适配的服务生命周期: {serviceDesc.Lifetime}") }; windsorContainer.Register(reg); } - 处理反向依赖场景(按需配置)
如果第三方库运行时需要依赖你已经在Windsor中注册的业务服务,不需要把这些服务重复注册到MS DI,只需要在构建MS DI服务提供器前,把需要的服务按需注册为工厂方法,解析时直接从Windsor获取实例即可:// 按需把Windsor中已有的服务暴露给MS DI使用 msServiceCollection.AddTransient<IServiceA>(sp => windsorContainer.Resolve<IServiceA>()); msServiceCollection.AddScoped<IServiceB>(sp => windsorContainer.Resolve<IServiceB>());
注意:不要做两个容器的全量双向同步,否则极易出现生命周期混乱、实例重复创建、内存泄漏等问题。始终保持Windsor作为业务侧的主容器,MS DI仅作为第三方库的适配层存在,业务代码全程只和Windsor交互,不需要感知MS DI的存在。
内容的提问来源于stack exchange,提问作者Owais F
相关产品推荐
相关产品推荐

