Castle Windsor:如何通过xml配置覆盖组件注册

时间:2011-09-14 23:17:06

标签: xml components castle-windsor overwrite

我正在尝试用另一个xml覆盖组件注册(通过xml完成​​)(在另一个xml中,使用具有相同组件ID的container.Install(Configuration.FromXmlFile("..."))通过代码加载,但是我收到错误说:

  

“无法注册组件COMP_ID。已有一个具有该名称的组件。   您想要修改现有组件吗?如果没有,请确保指定   一个独特的名字。“

事实上,我实际上想要修改现有组件,以便能够在基本的castle.xml文件中定义基本连线,然后在另一个custom.xml中覆盖它。文件,在基本文件后加载。

我正在尝试使用相同的组件ID,因为它会重写以前的注册。

现实是我想改变用于响应服务的实现,组件id只是我做过的尝试。由于Castle有首次注册获胜的政策,例如,转换到最后注册获胜就足够了。

具体示例

让我们使用ILogger接口的示例。

基本的castle.xml(加载总是)将是这样的:

<component id="logger" service="ILogger" type="NullLogger" ></component>

castle.dev.xml文件(在开发环境中仅加载 ,在默认环境之后)将如下所示:

<component id="logger" service="ILogger" type="AspNetTraceLogger" ></component>

castle.prod.xml文件(在生产环境中仅加载 ,在默认版本之后加载而不是)将如下所示:

<component id="logger" service="ILogger" type="SqlServerLogger" ></component>

现在:对于每个配置,我想说“用这个impl响应ILogger请求”,所以我只需要其中一个响应每次ILogger的请求。

有人有任何想法吗?

更新

我将补充:截至目前我正在使用a,我们应该说,“反向覆盖”技术,我在相应的“默认”之前加载覆盖文件“first”。通过这种方式,由于策略是第一次获胜,我可以将它们声明为覆盖,即使它们之前已在内部声明。这种方法的问题是,当我有一个我知道的接口将被多次实现时(例如,IWhateverListener):在这种情况下我不能删除已经注册的其他的,并且不能使用第一个-wins解决方案,因为稍后我将使用ResolveAll(),并且也将使用“默认值”。

1 个答案:

答案 0 :(得分:1)

不要尝试注册具有相同ID的多个组件,或尝试破解它。

如果您必须使用XML,请查看defines and ifs

否则只需使用不同的installers,每个环境一个,并在应用程序启动时注册你想要的那个

相关问题