如何通过构造函数参数名称解析Castle Windsor依赖
解决Castle Windsor中按构造函数参数名称匹配命名组件的问题
嘿,针对你这个场景(用Castle Windsor容器,让Foo和Bar分别根据构造函数参数名称注入对应的命名IService实例),有两种实用的解决方式,看你需求选就行:
方式一:全局开启参数名称自动匹配
如果你希望整个容器都遵循「构造函数参数名称=组件名称」的匹配规则,可以通过配置依赖解析器来实现,这样就不用给每个服务单独配置依赖了:
var container = new WindsorContainer(); // 关键配置:开启用参数名称作为依赖名称的解析逻辑 container.Kernel.Resolver.AddSubResolver(new DefaultDependencyResolver(container.Kernel, true)); // 注册你的两个IService命名组件 container.Register( Component.For<IService>().ImplementedBy<SecretService>().Named("secretService"), Component.For<IService>().ImplementedBy<PublicService>().Named("publicService") ); // 直接注册Foo和Bar即可,容器会自动根据参数名称匹配对应组件 container.Register( Component.For<Foo>(), Component.For<Bar>() ); // 测试解析 var foo = container.Resolve<Foo>(); // 注入的是publicService实例 var bar = container.Resolve<Bar>(); // 注入的是secretService实例
方式二:逐个组件显式指定依赖
如果不想全局开启自动匹配,只想给Foo和Bar单独配置,可以在注册它们的时候,用DependsOn显式绑定构造函数参数到对应的命名组件:
var container = new WindsorContainer(); // 先注册两个IService命名组件 container.Register( Component.For<IService>().ImplementedBy<SecretService>().Named("secretService"), Component.For<IService>().ImplementedBy<PublicService>().Named("publicService") ); // 注册Foo时,指定构造函数的`publicService`参数对应名为"publicService"的组件 container.Register( Component.For<Foo>() .DependsOn(Dependency.OnComponent("publicService", "publicService")) ); // 注册Bar时,指定构造函数的`secretService`参数对应名为"secretService"的组件 container.Register( Component.For<Bar>() .DependsOn(Dependency.OnComponent("secretService", "secretService")) ); // 测试解析 var foo = container.Resolve<Foo>(); var bar = container.Resolve<Bar>();
注意事项
- 两种方式都要求构造函数参数名称和组件注册的名称完全一致(默认区分大小写),所以要确保参数名和
Named()里的字符串匹配。 - 方式一适合项目中普遍需要按参数名称匹配的场景,方式二更灵活,适合局部特殊配置的情况。
内容的提问来源于stack exchange,提问作者Gurpreet
相关产品推荐
相关产品推荐

