2 вопроса в одном, но очень тесно связаны.
Возможно ли с помощью Castle Windsor разрешить запись конфигурации, например -
Assembly.Namespace.Object1`2 [[$ {ComponentId1}], [$ {ComponentId2}]], сборка
Где ComponentId1 и ComponentId2 определены как компоненты. Кажется, Castle Windsor не разрешает ComponentId, он просто ищет ComponentId1 в сборке Castle.Windsor.
Второй вопрос вступает в игру, если вы не можете ответить на первый вопрос. Если вам нужно использовать полную ссылку на сборку вместо ComponentId, как вы можете передать какие-либо параметры создаваемому объекту? например, чтобы установить ComponentId1.Field1 = "blah", или передать что-нибудь конструктору ComponentId1
Надеюсь, что имеет смысл
Обновление -
После запроса кода я собрал следующее -
Предметы
public class Wrapper<T, T1> where T : ICollector where T1:IProcessor
{
private T _collector;
private T1 _processor;
public Wrapper(T collector, T1 processor)
{
_collector = collector;
_processor = processor;
}
public void GetData()
{
_collector.CollectData();
_processor.ProcessData();
}
}
public class Collector1 : ICollector
{
public void CollectData()
{
Console.WriteLine("Collecting data from Collector1 ...");
}
}
public class Processor1 : IProcessor
{
public void ProcessData()
{
Console.WriteLine("Processing data from Processor1 ...");
}
}
повторяется так 3 для каждого типа объекта в примере
Config
<components>
<component id="Collector1"
service="CastleWindsorPlay.ICollector, CastleWindsorPlay"
type="CastleWindsorPlay.Collector1, CastleWindsorPlay"/>
<component id="Collector2"
service="CastleWindsorPlay.ICollector, CastleWindsorPlay"
type="CastleWindsorPlay.Collector2, CastleWindsorPlay"/>
<component id="Collector3"
service="CastleWindsorPlay.ICollector, CastleWindsorPlay"
type="CastleWindsorPlay.Collector3, CastleWindsorPlay"/>
<component id="Processor1"
service="CastleWindsorPlay.IProcessor, CastleWindsorPlay"
type="CastleWindsorPlay.Processor1, CastleWindsorPlay"/>
<component id="Processor2"
service="CastleWindsorPlay.IProcessor, CastleWindsorPlay"
type="CastleWindsorPlay.Processor2, CastleWindsorPlay"/>
<component id="Processor3"
service="CastleWindsorPlay.IProcessor, CastleWindsorPlay"
type="CastleWindsorPlay.Processor3, CastleWindsorPlay"/>
<component id="Wrapper1"
type="CastleWindsorPlay.Wrapper`2[[CastleWindsorPlay.Collector1, CastleWindsorPlay],[CastleWindsorPlay.Processor3, CastleWindsorPlay]], CastleWindsorPlay" />
</components>
Инстанцирование
var wrapper = (Wrapper<ICollector, IProcessor>) container.Resolve("Wrapper1");
wrapper.GetData();
Этот краткий пример ошибки с этим сообщением об ошибке, хотя -
Невозможно создать компонент 'Wrapper1', так как он имеет зависимости, которые должны быть удовлетворены.
Wrapper1 ожидает следующих зависимостей:
Услуги:
- CastleWindsorPlay.Collector1, который не был зарегистрирован.
- CastleWindsorPlay.Processor3, который не был зарегистрирован.
Любопытно, что я могу разрешить Collector1 и Processor3 по отдельности перед вызовом оболочки, но оболочка все равно их не видит.
Это базовый пример, следующее, что я хотел бы сделать, - это при создании экземпляра Wrapper, установить свойство на коллекторе и / или процессоре. Так что это может быть что-то наподобие Collector.Id = 10, но установленное в конфигурации, где определена оболочка. Настройка против определения компонента Collector не будет работать, так как я хотел бы иметь возможность создавать несколько экземпляров каждого Collector, используя разные идентификаторы
Обновление 2
То, что я на самом деле пытаюсь сделать, это иметь -
<components>
<component id="Wrapper1"
type="CastleWindsorPlay.Wrapper`2[${Collector1}(id=1)],[${Processor3}]], CastleWindsorPlay" />
<component id="Wrapper2"
type="CastleWindsorPlay.Wrapper`2[${Collector1}(id=3)],[${Processor3}]], CastleWindsorPlay" />
</components>
Затем укажите другой объект как
<component id="Manager"
type="CastleWindsorPlay.Manager,CastleWindsorPlay">
<parameters>
<wrappers>
<array>
<item>${Wrapper1}</item>
<item>${Wrapper2}</item>
</array>
</wrappers>
</parameters>
Тогда, наконец, в коде просто можно позвонить -
var manager = (Manager)container.Resolve("Manager");
Это должно вернуть объект менеджера, с заполненным массивом упаковщиков и настроенными упаковщиками с правильными Collector и Convertor.
Я знаю, что здесь есть ошибки в конфигурации Castle, поэтому я задаю вопрос, я не знаю, как настроить конфигурацию так, чтобы я делал то, что мне нужно, или даже если это возможно сделать в замке Виндзор