c# - caSTLe-windsor 中的多装饰器模式

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

我们正在重新设计一些遗留软件以使其更易于测试,并决定使用依赖注入(inject)和 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、文件还是神奇地从帽子中取出。

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

关于如何进步有什么想法吗?

最佳答案

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

关于c# - caSTLe-windsor 中的多装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10755727/

相关文章:

c# - 字典将为空键

java - Spring如何用环境变量替换${}?

swift - 将 SwInject 与中央观察者模式结合使用

c# - 你能解释一下这种泛型行为吗?如果我有解决方法?

c# - 如何在 .net 4.5 中读取连接字符串

c# sql插入有很多参数

.net - 如何在不打开数据库的情况下测试SqlServer连接

c# - 仅当 DataGridView 中的 Cell ValueChanged 时如何运行 Run CellEndEdit

javascript - 如何正确使用 Angular 工厂?

c# - 暴力破解函数输入以找到最大值的算法