【问题标题】:Castle Windsor: Inject array of services from xml configCastle Windsor:从 xml 配置中注入一系列服务
【发布时间】:2012-12-02 14:39:25
【问题描述】:

我在使用 xml 配置通过 Castle Windsor 注入一系列服务时遇到问题。我已经关注this 链接,它很好地解释了它,但不知何故它对我不起作用。这是我正在使用的代码:

class Program
{
    static void Main(string[] args)
    {
        IWindsorContainer container = new WindsorContainer();
        container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());

        var consumer = container.Resolve<Consumer>();
    }
}

public class Consumer
{
    public Consumer(IFoo[] foos)
    {
        foreach (IFoo foo in foos)
            foo.Foo();
    }
}

public interface IFoo
{
    void Foo();
}

public class Foo1 : IFoo
{
    public void Foo() { }
}

public class Foo2 : IFoo
{
    public void Foo() { }
}

这里是 app.config:

<castle>
  <components>
     <component id="Foo1" service="Test.IFoo, Test" type="Test.Foo1, Test" />
     <component id="Foo2" service="Test.IFoo, Test" type="Test.Foo2, Test" />

     <component id="Consumer" service="Test.Consumer, Test">
        <parameters>
           <foos>
              <array>
                 <item>${Foo1}</item>
                 <item>${Foo2}</item>
              </array>
           </foos>
        </parameters>
     </component>
  </components>
</castle>

奇怪的是,我得到的错误如下:

Can't create component 'Test.Consumer' as it has dependencies to be satisfied.
'Test.Consumer' is waiting for the following dependencies:
- Service 'Test.IFoo[]' which was not registered.

为什么它期望 IFoo[] 作为服务?这有任何意义吗?或者我所指的链接可能不再适用于当前版本的温莎(我在 3.1.0 上)?

【问题讨论】:

    标签: xml arrays castle-windsor castle inject


    【解决方案1】:

    再次回答我自己的问题(对不起;-):

    原来解决方案非常简单——只要你知道。添加一个 ArrayResolver 作为子解析器不仅可以使它工作:

        static void Main(string[] args)
        {
            IWindsorContainer container = new WindsorContainer();
            container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel));
            container.Install(Castle.Windsor.Installer.Configuration.FromAppConfig());
    
            var consumer = container.Resolve<Consumer>();
        }
    

    但甚至简化了配置,因为您不必设置实例:

      <configuration>
         <configSections>
            <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
         </configSections>
         <castle>
            <components>
               <component id="Foo1" service="Test.IFoo, Test" type="Test.Foo1, Test" />
               <component id="Foo2" service="Test.IFoo, Test" type="Test.Foo2, Test" />
               <component id="Consumer" service="Test.Consumer, Test"/>
            </components>
         </castle>
      </configuration>
    

    事实证明,温莎城堡很棒,但文档却不是,而且您在网络上找到的许多不同版本的示例并不会让您更容易......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多