2

Castle Windsor を介して xml 構成で一連のサービスを注入する際に問題が発生しています。私はそれを非常によく説明しているこのリンクをたどりましたが、どういうわけかうまくいきません。私が使用しているコードは次のとおりです。

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[] をサービスとして期待するのはなぜですか? それは意味がありますか?それとも、私が参照しているリンクが現在のバージョンの Windsor (私は 3.1.0 を使用しています) では機能しなくなったのでしょうか?

4

1 に答える 1

5

もう一度自分の質問に答えるには (申し訳ありません;-):

解決策は非常に簡単であることが判明しました - 一度知ってしまえば。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>

いつものように、Castle Windsor は素晴らしいですが、ドキュメントはそうではなく、Web で例を見つけることができる多くの異なるバージョンでは、簡単にはなりません...

于 2012-12-17T10:22:14.423 に答える