14

我们正在重新设计一些遗留软件以使其更具可测试性,并决定使用 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、文件还是神奇地从帽子里拉出来。

我认为我们的设计有问题,但不确定如何解决。

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

4

1 回答 1

18

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

于 2012-05-29T22:13:20.147 回答