Подтвердить что ты не робот

Множество декораторов в замке-виндзоре

Мы в процессе перепрофилирования некоторых устаревших программ, чтобы быть более проверяемыми, и решили использовать Dependency-Injection и Castle.Windsor, чтобы помочь нам.

Во-первых, наша цель: * Несколько декораторов, которые все работают на потоке данных. * Возможны несколько комбинаций декораторов, и корневые узлы в каждом случае могут потребоваться для получения данных из разных мест.

Технически наш дизайн выглядит следующим образом:

interface IUpdateableValue<T> 
{
  T Get();
};

У нас есть, например, три набора данных, которые нужно получить с помощью нескольких компонентов, все реализующие IUpdateableValue() (псевдокод):

JsonParser(
    Decompressor(
        Decrypter(decryptionKey
            FileCache(filename, 
                HttpWebDownloader(url))))

XmlParser(
    Decompressor(
        Decrypter(decryptionKey2
            FileCache(filename2, 
                HttpWebDownloader(url2))))

У меня возникли проблемы с дизайном, чтобы вписаться в DI-framework, например Castle-Windsor. Я подозреваю, что некоторые из них могут обрабатываться именованными экземплярами, но это кажется вонючим для этого использования.

Идея состоит в том, что "пользователь", например, экземпляры JsonParser и XmlParser не знают (или не заботятся) о том, поступают ли данные из HttpUrl, файла или магически вытаскиваются из шляпы.

Я думаю, что в нашем дизайне что-то не так, но не знаете, как это исправить.

Любые идеи о том, как продвигаться вперед?

4b9b3361

Ответ 1

С Castle Windsor вы можете неявно настроить декораторы, зарегистрировав их в правильном порядке. Сначала вам необходимо зарегистрировать внешний декоратор:

container.Register(Component
  .For<IUpdateableValue>()
  .ImplementedBy<JsonParser>());
container.Register(Component
  .For<IUpdateableValue>()
  .ImplementedBy<Decompressor>());
container.Register(Component
  .For<IUpdateableValue>()
  .ImplementedBy<Decrypter>());
...

Когда вы разрешаете IUpdateableValue, Caste Windsor автоматически свяжет зависимости, поэтому они правильно вложены.