Использовать идентификатор компонента в конфигурации универсального объекта Castle Windsor - PullRequest
0 голосов
/ 08 июня 2010

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, поэтому я задаю вопрос, я не знаю, как настроить конфигурацию так, чтобы я делал то, что мне нужно, или даже если это возможно сделать в замке Виндзор

1 Ответ

1 голос
/ 09 июня 2010

UPDATE2

Хорошо, теперь это начинает иметь смысл :) И, как я сказал с самого начала, похоже, что вы ищете переопределения службы:

<components>
<component id="Wrapper1" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
   <parameters>
      <collector>${collector1WithId1}</collector>
      <collector>${processor3WithId3}</collector>
   </parameters>
</component>

<component id="Wrapper2" type="CastleWindsorPlay.Wrapper`2[<<closing types go here>>]/>
   <parameters>
      <collector>${collector1WithId5}</collector>
      <collector>${processor3WithId8}</collector>
   </parameters>
</component>
</components>

UPDATE

Хорошо, спасибо за пример. Причина, по которой вы получаете ошибку, состоит в том, что вы регистрируете компонент Collector1 и компонент Processor3 в качестве службы ICollector и IProcessor соответственно. У вас нет службы для Collector1 и Processor3, поэтому, когда Виндзор пытается предоставить их, он не может найти их, следовательно, сообщение об исключении.

Вам необходимо зарегистрировать их соответствующим образом услуги , чтобы это работало.


Я не знаю, что вы пытаетесь сделать здесь, но я предполагаю, что вы ищете переопределения службы и встроенные параметры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...