当创建的类也需要运行时值时进行依赖注入?

2023-11-23

假设您将系统划分为价值对象和服务对象(如“开发面向对象的软件,由测试引导”中所建议的)。 Misko Hevery 将这些对象称为“可更新对象”和“可注入对象”。

当您的值对象之一突然需要访问服务来实现其方法时会发生什么?

假设您有一个很好的简单 Value 对象。它是不可变的,包含一些信息,仅此而已。假设我们像这样使用它:

CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
  // do stuff
} 
else
{
  // don't do stuff
}

到目前为止,一切都很好。isValid()对卡号实施校验位算法并返回真/假。

现在,假设我希望通过根据当前时间验证到期日期来增强系统。您建议如何在不破坏值对象/服务对象范式的情况下完成此操作?我希望这个类能够继续进行单元测试。

  • CreditCard现在有了一个依赖项,但是由于它的创建方式,它无法被注入,所以依赖项注入已经过时了。
  • The CreditCard类不应该调用单例(我认为全局访问单例是不好的做法)
  • 把行为放在CreditCardVerificationService.validateCard()意味着必须重新审视所有现有代码。 isValid() 的实现正在泄漏。

我知道可以采取一些措施来解决这个问题,但是最干净的方法是什么?


我认为验证任何东西并不是 CreditCard 对象的工作。工厂将验证校验位以确保它正在实例化合格的卡,而验证服务将验证卡的有效期/$限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当创建的类也需要运行时值时进行依赖注入? 的相关文章

  • Cython 中的抽象类(具有纯虚方法)

    快速版本 如何在 Cython 中声明抽象类 目标是只声明接口 以便其他类可以继承它 必须有没有实施这个班级的 接口 pxd cdef class IModel cdef void do smth self impl pyx from in
  • 为什么要使用继承? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是依赖注入的 Pythonic 方式?

    介绍 对于 Java 依赖注入作为纯 OOP 工作 即您提供要实现的接口 并在框架代码中接受实现定义的接口的类的实例 现在对于 Python 您可以执行相同的操作 但我认为该方法对于 Python 而言开销太大 那么如何以 Pythonic
  • UML三元关联实现java代码[重复]

    这个问题在这里已经有答案了 三元关联是结构关系 指定一个事物的对象连接到其他两个事物的对象 我理解这种关系 但我不知道如何实现显示这三个类之间关联的方法 让我们考虑下面的例子 项目有许多使用特定编程的开发人员 语言促进发展 开发人员使用特定
  • 服务中有很多依赖项

    我在服务层的应用程序中遇到依赖关系问题 我有以下课程
  • 向类添加属性的更 Pythonic 方式?

    我正在使用来自两个不同网页的数据集 但对于同一个人 数据集是合法信息 一些数据在第一页上可用 因此我使用正确的信息初始化被告对象 并将我当前没有数据的属性设置为null 这是班级 class Defendant object holds d
  • 如何区分类实现中两个协议的相同方法名称?

    我有两个协议 protocol P1 void printP1 void printCommon end protocol P2 void printP2 void printCommon end 现在 我在一个类中实现这两个协议 inte
  • 名称中带有点的 php 对象属性

    我有 mysql 表 其中包含 操作 日期 操作 名称 等列 将该表数据作为对象获取后 mysqli gt fetch object 我得到这个 行的 print r stdClass Object id gt 2 operation da
  • 在 Javascript 构造函数中引用实例变量

    我试图通过执行以下操作来维护对象的状态 obj function this foo undefined this changeState function function this foo bar This is contrived bu
  • 添加类方法后如何更新类的实例?

    我发现自己陷入了困境 我开发了一个类 然后创建了该类的一个实例 这些类通常会执行数据和统计操作 这些操作需要很长时间 有时需要 20 分钟 我将继续开发我的类 并向其中添加其他方法 现在 如何使用新方法更新以前的类实例而不重新初始化该类的旧
  • 跨程序集和命名空间的依赖注入

    我正在解决一个 DI 问题 我认为我了解其原因 但我需要一些建议来解决 我构建了一个与 Sql 对话的独立程序集 将此程序集称为 a 以及另一个包含业务逻辑的程序集 将此程序集称为 b 我在 b 程序集中为 db 类创建了一个接口 由于该接
  • 在 MVC 中使用 DI 时的大量控制器构造函数参数列表

    我正在开发 ASP NET MVC3 解决方案 该解决方案使用 autofac 的依赖注入 我们的控制器由 autofac 正确创建 所有必需的对象都正确传入 这些对象通常包括服务 存储库和将域对象转换为 MVC 视图 模型的映射器 所以控
  • Cakephp:将 AppController 抽象到另一个层次,可能吗?

    我想知道是否可以在 AppController 和我的应用程序的其他控制器之间添加另一个抽象控制器 这样我的控制器 例如UsersController 扩展了 SecureController SecureController 扩展了 Ap
  • 如何使PHP库松耦合? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android 中 Activity 之间的对象共享

    您好 我有一个关于在整个应用程序中传递对象的问题 假设我想在整个应用程序中拥有一个大的自定义对象 该对象将被多个活动和服务使用 我一开始做的就是这样的 首先 我创建了一个 Application 类并定义了一个单例对象 public cla
  • 使用组合来表示“is – a”关系时出现的问题

    我正在为人力资源系统开发系统 有会计员工和程序员员工 加入公司的第一个月 员工没有被赋予任何角色 一名员工可以同时担任会计师和程序员 我有一个由以下代码所示的设计 现在 我需要通过实现新功能来增强系统 解雇所有会计师 终止意味着将员工的状态
  • 如何将一个窗格连接到另一个窗格

    如何将输出连接到paneWithList PaneWithList其上有一个监听器JList以便将所选行输出到控制台 我怎样才能将该输出定向到JTextPane关于输出 Could PaneWithList触发一个事件Main拿起 会属性更
  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • Python Tkinter OOP 布局配置

    我正在尝试使用 tkinter 构建一个应用程序 该布局在没有 OO 原则的情况下工作 但我很难理解应该如何将其转移到 OO The layout is as shown in the pic below 1280x720px 我有以下内容

随机推荐

  • 如何默认将AWS S3存储桶中的所有对象设为公开?

    我正在使用 PHP 库将文件上传到我的存储桶 我已将 ACL 设置为公共读写它工作正常 但文件仍然是私有的 我发现如果我改变受赠者给所有人它使文件公开 我想知道的是我该如何制作所有对象的默认受让人在我的桶中设置为 每个人 或者还有其他解决方
  • 在 AngularJs 中使用 $resource 来保存对象数组

    我在用 resource使用查询从服务器检索数据 服务器返回一个对象数组 我将其存储在斯图克利斯特 我可以发送 更新的 内容斯图克利斯特通过循环数组并使用 save 将数组的每个项目发送回服务器来返回到服务器 我现在想发送所有项目 整个斯图
  • iPhone - 读取Setting.bundle返回错误值

    我创建了一个 Settings bundle 其中包含 Root plist 文件和本地化目录 en lproj 我已经编辑了 Root plist 并添加了一些我想要为我的应用程序设置的设置 当我从 iPhone 中删除该应用程序并安装它
  • 更新到 Android Studio 后模拟器无法启动

    我已经通过标准更新通道将android studio更新到3 0 更新后无法启动模拟器 我已经尝试过以下方法 但没有任何效果 重新启动并重新安装 HAXM 安装程序 重新启动并重新安装 AVD 管理器 从终端启动模拟器 将 RAM 大小更改
  • 如何将 Kubernetes 集群更新到可用的最新版本?

    我最近开始尝试Google Container Engine 我希望您将 Kubernetes 集群升级到可用的最新版本 如果可能的话 不要停机 有什么办法可以做到这一点吗 不幸的是 我们目前拥有的最佳答案是创建一个新集群并将资源移过来 然
  • 如何使用 JavaScript 进行 LDAP 查询?

    我正在尝试制作一个具有 LDAP 查询功能的侧边栏小工具 但一直无法找到关于此事的非常好的或任何有用的文档 我对 Javascript 没有太多经验 并且对 LDAP 查询的功能知之甚少 所以任何信息都会有用 info 主持人 ab c d
  • R (data.table) 按自定义范围对数据进行分组(例如,-18、18-25、...、65+)

    我无法在 R 中找到解决方案 使用 data table 来按自定义范围 例如 18 18 25 65 而不是按单个值对数据进行分组 我现在正在使用的 DT list M Savings mean Savings M Term mean T
  • JTextArea 中的撤消功能

    我正在尝试实现撤消功能JTextArea 谷歌搜索教程并按照其中一个教程编写了以下代码 当按下 Ctrl Z 键时会触发该事件 它不适合我 我错过了什么吗 private void undoActionPerformed java awt
  • aiobotocore - 导入错误:无法导入名称“InvalidIMDSEndpointError”

    下面的代码引发导入异常 import s3fs fs s3fs S3FileSystem anon False 例外 Traceback most recent call last File issue py line 1 in
  • 通过environment.yml使用conda安装npm包

    我想知道是否可以直接通过 conda 安装 npm 包environment yml文件 我知道可以安装pypi包与pip直接如下 name docs channels conda forge dependencies python gt
  • 什么是 Android“提取文本 UI”?

    我最近遇到了一个错误 我的小 EditText 不断膨胀以填充软键盘未占用的任何空间 但仅限于横向模式 我发布了此内容 并得到了一位乐于助人的 StackOverflow 成员的快速回复 我需要添加该内容android imeOptions
  • 如何在cakephp表单中使用jquery.validate插件

    我的 jQuery 代码是 document ready function StudentRegisterForm validate rules email required true email true 在我的表单电子邮件中 td td
  • Bgr32 PixelFormat 中的第四个通道是什么

    我目前正在用 C 做一些图像处理工作 我对 Bgr32 Pixel 格式感到困惑 以下描述来自于microsoft msdn http msdn microsoft com en us library system windows medi
  • Android 上的 Apache Commons 编解码器:找不到方法

    今天我尝试将 apache commons codec 包包含在我的 Android 应用程序中 但无法运行它 Android 无法找到方法 ord apache commons codec binary 并在 DDMS 中输出以下错误 0
  • Jquery UI 日期选择器。禁用日期数组

    我一直在尝试寻找 Jquery ui datepicker 问题的解决方案 但没有运气 这就是我想做的 我有一个应用程序 我正在执行一些复杂的 PHP 操作来返回一个 JSON 日期数组 我希望将其阻止在 Jquery UI Datepic
  • sin 和 cos 的向量化

    我正在玩编译器资源管理器并遇到了异常 我认为 如果我想让编译器向量化一个sin计算 using libmvec 我会写 include
  • C# 正则表达式排除字符串

    我得到了一个字符串集合 我想要的正则表达式就是收集所有以 http 开头的 href http www test com cat 1 one piece episodes href http www test com cat 2 movie
  • 有没有办法标记 docker 镜像中的前一层或恢复提交?

    假设有一个 docker 镜像 有人对其进行了更改 然后将其推送到 docker 存储库 然后我拉下图像 有没有办法获取该图像并运行上一层的容器 运行更改之前的版本 如果我运行 docker History 它将看起来像这样 docker
  • 如何克服“错误:在注册表中找不到对象‘jupyter.widget’”?

    我在 kubernetes 上的 jupyterhub 中运行 jupyterlab 我正在尝试使用例如显示小部件 from ipywidgets import interact interact x 0 100 10 def p x 50
  • 当创建的类也需要运行时值时进行依赖注入?

    假设您将系统划分为价值对象和服务对象 如 开发面向对象的软件 由测试引导 中所建议的 Misko Hevery 将这些对象称为 可更新对象 和 可注入对象 当您的值对象之一突然需要访问服务来实现其方法时会发生什么 假设您有一个很好的简单 V