如何修改Castle Windsor源码,将默认生命周期从Singleton改为Transient
修改Castle Windsor默认生命周期为Transient的具体步骤
我刚好对Castle Windsor的源码结构比较熟悉,帮你梳理下具体修改步骤,这样就能把默认生命周期从Singleton改成Transient:
1. 定位核心源码文件
首先打开你下载的Castle Windsor源码,重点关注两个关键文件:
- Castle.Core/ComponentModel.cs:组件模型的核心定义,这里会初始化默认的生命周期类型
- Castle.Windsor/DefaultComponentModelBuilder.cs:组件模型构建器,负责设置组件的默认配置
2. 修改ComponentModel的默认生命周期
打开ComponentModel.cs,找到它接收name、service、implementation参数的构造函数,里面会有一行设置默认生命周期的代码:
LifestyleType = LifestyleType.Singleton;
把它改成:
LifestyleType = LifestyleType.Transient;
3. 修正DefaultComponentModelBuilder的默认初始化逻辑
接着打开DefaultComponentModelBuilder.cs,找到InitializeDefaults方法,里面同样会有设置默认生命周期的代码(防止构造函数的设置被覆盖):
componentModel.LifestyleType = LifestyleType.Singleton;
同样替换成:
componentModel.LifestyleType = LifestyleType.Transient;
4. 编译并替换程序集
完成上述修改后,重新编译Castle Windsor的解决方案(重点编译Castle.Core和Castle.Windsor项目),得到新的Castle.Core.dll和Castle.Windsor.dll,替换你项目中原来的引用即可。
额外注意事项
- 这样修改后,所有没有显式指定生命周期的组件都会默认使用Transient模式,完全符合你注重安全性的需求(避免单例组件的状态共享风险)
- 如果你需要个别组件保留Singleton生命周期,只需要在注册时显式指定即可,比如:
container.Register(Component.For<IMyService>().ImplementedBy<MyService>().LifestyleSingleton());
内容的提问来源于stack exchange,提问作者Eitan
相关产品推荐
相关产品推荐

