我正在尝试用另一个xml覆盖组件注册(通过xml完成)(在另一个xml中,使用具有相同组件ID的container.Install(Configuration.FromXmlFile("..."))
通过代码加载,但是我收到错误说:
事实上,我实际上想要修改现有组件,以便能够在基本的castle.xml文件中定义基本连线,然后在另一个custom.xml中覆盖它。文件,在基本文件后加载。“无法注册组件COMP_ID。已有一个具有该名称的组件。 您想要修改现有组件吗?如果没有,请确保指定 一个独特的名字。“
我正在尝试使用相同的组件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(),并且也将使用“默认值”。
答案 0 :(得分:1)
不要尝试注册具有相同ID的多个组件,或尝试破解它。
如果您必须使用XML,请查看defines and ifs。
否则只需使用不同的installers,每个环境一个,并在应用程序启动时注册你想要的那个