我们正在重新设计一些遗留软件以使其更具可测试性,并决定使用依赖注入和 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、文件或神奇地从帽子里拉出来。
我认为我们的设计有问题,但不确定如何解决。
关于如何进步有什么想法吗?
使用温莎城堡,您可以通过以正确的顺序注册装饰器来隐式配置装饰器。您需要先注册外部装饰器:
container.Register(Component
.For<IUpdateableValue>()
.ImplementedBy<JsonParser>());
container.Register(Component
.For<IUpdateableValue>()
.ImplementedBy<Decompressor>());
container.Register(Component
.For<IUpdateableValue>()
.ImplementedBy<Decrypter>());
...
当您解析 IUpdateableValue Caste Windsor 时,Windsor 将自动连接依赖项,以便它们正确嵌套。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)