Castle Windsor: как перезаписать регистрацию компонента через конфигурацию xml - PullRequest
0 голосов
/ 15 сентября 2011

Я пытаюсь перезаписать регистрацию компонента (сделанную через xml) другой (в другом xml, загруженном через код с использованием container.Install(Configuration.FromXmlFile("...")), который имеет тот же идентификатор компонента, но я получаю сообщение об ошибке:

"Компонент COMP_ID не может быть зарегистрирован. Уже есть компонент с таким именем. Хотите вместо этого изменить существующий компонент? Если нет, убедитесь, что вы указали уникальное имя."

Дело в том, что я на самом деле хотел бы изменить существующий компонент , чтобы иметь возможность определить базовую разводку в базовом файле castle.xml, а затем перезаписать его в другом файле custom.xml., загруженный после основного.

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

Реальность такова, что я хотел бы изменить то, чтоРеализация используется для ответа на сервис, идентификатор компонента - это просто попытка, которую я сделал. Поскольку у Castle есть политика первичных регистраций, было бы достаточноh например, чтобы переключиться на последний выигрыш при регистрации, например.

Конкретный пример

Давайте использовать пример интерфейса ILogger.

Базовый замок.xml (загруженный всегда ) будет выглядеть следующим образом:

<component id="logger" service="ILogger" type="NullLogger" ></component>

Файл castle.dev.xml (загружается только в dev ambient после значения по умолчанию)один) будет выглядеть следующим образом:

<component id="logger" service="ILogger" type="AspNetTraceLogger" ></component>

Файл castle.prod.xml (загружается только в производственной среде, после файла по умолчанию вместо dev one) будет выглядеть так:

<component id="logger" service="ILogger" type="SqlServerLogger" ></component>

Теперь: для каждой из этих конфигураций я хотел бы сказать «отвечать на запросы ILogger с этим impl», поэтому мне нужно иметь только одну из них дляотвечать на запросы ILogger каждый раз.

У кого-нибудь есть идеи?

update

Я добавлю: на данный момент я использую, скажем так, метод "обратной перезаписи", когда я загружаю перезаписываемые файлы "первым", перед соответствующими "по умолчанию".Таким образом, поскольку политика имеет приоритет, я могу объявить их перезаписанными, хотя внутренне они были объявлены ранее.Проблема с этим подходом заключается в том, что когда у меня есть интерфейс, который я знаю, будет реализован более одного раза (скажем, IWheverListener): в этом случае я не могу удалить другие уже зарегистрированные и не могу использовать первыйвыигрывает решение, потому что позже я буду использовать ResolveAll (), а также будут использоваться «значения по умолчанию».

1 Ответ

1 голос
/ 20 сентября 2011

Не пытайтесь зарегистрировать несколько компонентов с одинаковым идентификатором или пытаться взломать его.

Если вам нужно использовать XML, взгляните на define и ifs .

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

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