创建类时的依赖注入还需要运行时值吗?

WW.*_*WW. 7 oop singleton dependency-injection injectable newable

假设您在Value对象和Services对象中划分系统(如"面向对象的软件增长,测试指导"中所述.Misko Hevery称这些为"newables"和"injectables".

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

假设你有一个很好的简单Value对象.它是不可变的,包含一些信息,而且就是它.假设我们使用类似这样的东西:

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

到现在为止还挺好. isValid()在卡号上实现校验位算法并返回true/false.

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

  • CreditCard 现在有一个依赖项,但由于它的创建方式,它无法注入,因此依赖注入已经完成.
  • CreditCard类不应该呼唤单身(我的位置,为一个Singleton全球访问是不好的做法)
  • 将行为置于CreditCardVerificationService.validateCard()手段意味着必须重新访问所有现有代码.isValid()的实现正在泄漏.

我知道有一些事情可以解决这个问题,但最干净的方法是什么?

exp*_*ent 4

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

  • 但这却颠覆了现实世界。信用卡没有任何方式来验证自己——伪造的、过期的卡广泛存在,并且不知道它们是否有效。如果您向支付处理商发送请求,他们不会询问您的卡是否有效或相信您的话 - 他们会自行确定,并仅请求执行此操作所需的数据。 (4认同)