在迁移到Windsor3之后,从xml注册不同的实现,并且为一个接口注册代码是失败的

本文关键字:注册 一个 失败 代码 接口 实现 之后 Windsor3 迁移 xml | 更新日期: 2023-09-27 18:29:49

我们正在将一个稳定的项目从Castle Windsor 2.5.2迁移到3.0。

我们使用混合的xml/api注册。切换到3.0后,通过ctor注入并在xml中定义的参数将无法再解析。

举例说明:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
  <properties>
    <frontEnd.url>http://site.com</frontEnd.url>
    <admin.email>admin@site.com</admin.email>
  </properties>
  <components>
    ...
    <component id="ServicesBootstrapperAction"
   service="SomeNS.Startup.IBootstrapperAction"
        type="SomeNS.Service.ServicesBootstrapperAction, Project-Service"
        >
      <parameters>
        <frontEndUrl>#{frontEnd.url}</frontEndUrl>
        <adminEmail>#{admin.email}</adminEmail>
        <prohibitedLogins>Assets/prohibited-logins.txt</prohibitedLogins>
      </parameters>
    </component>
    ...
  </components>
</configuration>

和注册:

        _container.Install(
            Castle.Windsor.Installer.Configuration.FromXmlFile("project.common.config"),
            Castle.Windsor.Installer.Configuration.FromXmlFile(String.Format("project.{0}.config", RuntimeEnvironment))
            );

在尝试解决此组件后,我们得到:

'SomeNS.Service.ServicesBootstrapperAction' is waiting for the following dependencies:
- Parameter 'frontEndUrl' which was not provided. Did you forget to set the dependency?
- Parameter 'adminEmail' which was not provided. Did you forget to set the dependency?
- Parameter 'prohibitedLogins' which was not provided. Did you forget to set the dependency?

同样,这是一个与2.5完美配合的东西,所以我想这可能是一些未记录(或我们错过/不理解)的突破性变化。

鉴别诊断,有人吗?

更新:我解决了这个问题,并找到了解决办法。我不喜欢它,但它很管用。

对于所有好奇的人来说,以下是说明问题的项目链接:https://docs.google.com/open?id=0B7XFrOzGfmirSldZUmRQeU9SZDZZVnV5UGhGaGhsUQ

请随意告诉我我错了,我应该使用其他漂亮的解决方案(什么?)。

在迁移到Windsor3之后,从xml注册不同的实现,并且为一个接口注册代码是失败的

尝试从节点名称中去掉句点。这应该无关紧要,但这是我唯一能看到的潜在问题(主要是因为,除了XAML之外,我还没有看到在XML节点名中使用太多句点)。

我认为关闭这个问题是公平的,因为我已经找到了解决原始问题的方法。

我真正的问题是,一个接口有几个实现(并且需要全部实现)。但是,有些实现需要参数(简单值),这些参数自然会移动到xml配置文件中,而其他实现则使用代码中的约定进行注册。

现在,为了避免双重注册,我已经使用了。除非3.0之前的(container.Kernel.HasComponent),它现在应该已经过时了,但编译得很好!

令人惊讶的是,除非(t=>container.Kernel.HasComponent(t.Name))和以前一样工作得很好!

我相信对此有一个解释,但我想不出任何解释。

我真的很喜欢Castle,也很喜欢使用它。但是45kb的突破性变化并不酷,对不起,伙计们。