Множество декораторов в замке-виндзоре
Мы в процессе перепрофилирования некоторых устаревших программ, чтобы быть более проверяемыми, и решили использовать 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, файла или магически вытаскиваются из шляпы.
Я думаю, что в нашем дизайне что-то не так, но не знаете, как это исправить.
Любые идеи о том, как продвигаться вперед?
Ответы
Ответ 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 автоматически свяжет зависимости, поэтому они правильно вложены.