Замок Виндзор: Внедрить массив служб из конфигурации XML
У меня проблемы с внедрением массива сервисов через 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)?
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>
Как всегда выясняется, что Castle Windsor великолепен, но документации нет, и множество различных версий, примеры которых вы найдете в Интернете, не облегчит...