温莎城堡中的多个装饰器模式

2024-02-28

我们正在重新设计一些遗留软件以使其更具可测试性,并决定使用依赖注入和 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(使用前将#替换为@)

温莎城堡中的多个装饰器模式 的相关文章

  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i

随机推荐

  • Elasticsearch 中的 PIT 成本如何?

    我知道scrollElasticsearch 有很多开销 而且search after一般是首选 但是 PIT 时间点 呢 它也有相同的开销吗 Is search after仍然比 PIT 快吗 Since 个人所得税杠杆search af
  • NetBeans Android 插件出错

    我目前正在开发一个 Android 应用程序 并且使用 Netbeans 6 9 1 和 nbandroid 1 0 beta 我已经安装了 Android SDK 并配置了所有内容 但是当我创建一个简单的项目并尝试构建它时出现错误 Cre
  • 如何丢弃在睡眠功能期间传递的用户输入?

    我正在尝试使用终端创建游戏 我询问玩家是否准备好 然后使用下面的代码进行倒计时 问题在于用户所做的所有输入都会添加到程序所做的下一个输入查询中 我正在寻找一种方法来丢弃以前的输入或在此函数期间完全阻止它 我可以做一个 getchar 循环
  • 使用 python 连接字节列表

    我正在尝试开发一个工具来读取二进制文件 进行一些更改并保存它 我想做的是列出文件中的每一行 处理几行 然后再次加入该列表 这是我尝试过的 file open myFile exe r b aList for line in f aList
  • php mysqli 准备语句选择

    尝试让一个函数能够为任何表创建带有多个参数的简单 CRUD 选择 我认为我已经完成了最难的部分 但现在无法获取数据 也许我做错了什么我无法弄清楚 我准备好的语句函数 function prepared query mysqli sql pa
  • emacs 不备份 git repo 中的文件

    emacs不创建文件内的备份git存储库 我希望保存它们 因为我经常依靠它们在将更改提交到git repo 我正在使用xemacs直到最近 它总是会创建通常的 第一次保存时的文件 但emacs如果在 a 内工作则不会执行此操作git项目 在
  • 从 jenkins 运行 selenium testNG 时,chrome 不会最大化

    我在跑步时遇到问题 硒测试NG 来自 jenkins 的测试 问题是我正在登录我的应用程序并检查一些元素可见性 当我直接从批处理文件运行测试时 我取得了成功 因为我将我的 google chrome 驱动程序设置为最大化使用 driver
  • 如何使用整理器按属性排序? (爪哇)

    我使用Java 我想使用 Collat or 按属性对对象的子列表进行排序 以便按字母顺序排序但忽略重音符号 问题是我尝试了不同的方法 但没有任何效果 这会对子列表进行排序 但不会忽略重音符号 newList subList 0 5 sor
  • Mapfile 作为 MapReduce 作业的输入

    我最近开始使用 Hadoop 在使用 Mapfile 作为 MapReduce 作业的输入时遇到问题 以下工作代码在 hdfs 中编写一个名为 TestMap 的简单 MapFile 其中包含三个 Text 类型的键和三个 BytesWri
  • Gradle 5 和 IntelliJ 2018.3。无法识别的选项:--add-opens 或 java.base.java.lang=ALL-UNNAMED

    我有一组由 Gradle 4 10 3 构建的复杂项目 我可以从命令行构建它们 但也可以将它们导入 IntelliJ 2018 3 Ultimate 不会出现重大问题 当我将 Gradle 升级到 5 1 1 时 项目仍然可以从控制台正常构
  • Perl Windows IPv6

    我有一个使用 TCP IP 套接字的 Perl Windows 应用程序 我需要添加 IPv6 支持 我有一台 Windows 7 64 位计算机 它运行带有 Hurricane Electric 隧道的 IPv6 它的得分为 10 分 满
  • 如何在 Github 中为 Makefile 保留选项卡

    Github 自动将制表符转换为多个空格 所以 每次我创建一个Makefile在 Github 中 我需要在我的 Linux 盒子中克隆存储库并编辑Makefile using vim进而push将更改返回到我的 Github 存储库以避免
  • 具有透明背景的 JavaFX 按钮

    我有一些经典Button在 JavaFX 中 带有一个包含一些文本的框 我需要没有那个框的按钮 只需要文本 当我悬停按钮或用鼠标单击按钮时 它会将其颜色更改为不同的颜色 在 JavaFX 中 样式是通过使用 CSS 来完成的 button
  • 使用 D3.js 在曲线类型之间转换

    我想使用 D3 js 在曲线类型之间进行转换 看一眼这个街区 https bl ocks org iaindillingham 67835c954c5e3a1fd00eed35a0b37765 数据保持不变 但曲线类型发生变化 我原以为路径
  • 将 Json 转换为 Poco 集合/如何编写 For Each?

    我对 Azure Functions 还很陌生 我创建了一个 C WebHook Azure 函数 我想这是正确的事情 来获取我的 json 内容并将其转换为简单的 poco dto 对象的集合 public static class Ge
  • 我的应用程序未显示在 Google Play 中 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我大约 18 小时前将我的应用程序上传到 google play 但它没有显示 开发者控制台显示 已发布 我想应该可以在 url
  • 使用ffmpeg处理rtsp流url时出现未知命令失败

    我想使用ffmpeg从rtsp流中抓取图像 命令如下 ffmpeg y i rtsp zigong stream xl02 cn 557 HongTranSvr DevId 1b038d27 858c 46a1 b803 a2984af34
  • 关闭 I/O 流

    如果我不关闭流 可能会发生哪些不好的事情 关闭操作会自动刷新吗 程序退出后所有的流都关闭了吗 提前致谢 如果您不关闭流 可能会发生不好的事情 你可能会用完文件句柄 您认为写入磁盘的数据可能仍在缓冲区中 仅 文件可能仍被其他进程锁定 取决于平
  • 将 .jar 文件添加到 git 存储库中

    我在 eclipse 上有一个项目 最近我创建了一个名为 lib 的新文件夹 并在其中添加了一些 jar 文件 我似乎无法将更改提交到 git 它只是没有出现在文件跟踪列表中 我已经从我的分支中的 gitignore 中删除了 jar 并提
  • 温莎城堡中的多个装饰器模式

    我们正在重新设计一些遗留软件以使其更具可测试性 并决定使用依赖注入和 Castle Windsor 来帮助我们 首先 我们的目标 许多装饰器都在数据流上工作 装饰器的多种组合是可能的 并且每种情况下的根节点可能需要从不同的地方获取数据 从技