在城堡 – 温莎的多个装饰员模式

我们正在重新设计一些遗留软件以使其更易于测试,并决定使用Dependency-Injection和Castle.Windsor来帮助我们。

首先,我们的目标:*许多装饰器都在数据流上工作。 *装饰器的多种组合是可能的,并且每种情况下的根节点可能需要从不同的地方获取数据。

从技术上讲,我们的设计如下:

interface IUpdateableValue { T Get(); }; 

我们有三组要检索的数据,包含许多组件,都实现了IUpdateableValue()(伪代码):

 JsonParser( Decompressor( Decrypter(decryptionKey FileCache(filename, HttpWebDownloader(url)))) XmlParser( Decompressor( Decrypter(decryptionKey2 FileCache(filename2, HttpWebDownloader(url2)))) 

我无法将设计融入像Castle-Windsor这样的DI框架中。 我怀疑其中一些可能由命名实例处理,但这似乎有点臭这种用法。

这个想法是,例如JsonParser和XmlParser实例的“用户”不知道(或关心)数据是来自HttpUrl,文件还是神奇地从帽子中拉出来的。

我认为我们的设计有问题,但不确定如何修复它。

关于如何进步的任何想法?

使用Castle Windsor,您可以通过以正确的顺序注册它们来隐式配置装饰器。 您需要先注册外部装饰器:

 container.Register(Component .For() .ImplementedBy()); container.Register(Component .For() .ImplementedBy()); container.Register(Component .For() .ImplementedBy()); ... 

解析IUpdateableValue时,Caste Windsor会自动连接依赖项,因此它们可以正确嵌套。