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

时间:2012-05-25 13:59:41

标签: c# .net dependency-injection castle-windsor ioc-container

我们正在重新设计一些遗留软件,以便更加可测试,并决定使用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))))

我无法将设计融入像Castle-Windsor这样的DI框架中。我怀疑其中一些可以通过命名实例来处理,但这种用法看起来很臭。

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

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

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

1 个答案:

答案 0 :(得分:13)

使用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会自动连接依赖项,因此它们可以正确嵌套。