【问题标题】:Is there a dependency injection framework for Smalltalk?Smalltalk 有依赖注入框架吗?
【发布时间】:2010-04-21 15:33:10
【问题描述】:

我正在运行 Pharo,我只是在一个用例中,这种用例需要依赖注入 à la Guice。 Smalltalk 有类似的东西吗?

我知道您可以通过仅显式传递您的依赖项来完成这一切。但这对我来说感觉很尴尬和冗长。

【问题讨论】:

  • @MauricioScheffer:这个问题讨论了控制反转,这与依赖注入不同。 DI 是一种模式,其中对象的客户端可以用他们选择的其他对象替换对象的依赖关系,这使得对象更可重用和更可测试(如果做得好的话)。 IoC 是一种模式,其中应用程序代码向框架注册,框架稍后调用应用程序代码,而不是应用程序代码直接调用框架代码。这有时被描述为“不要给我们打电话,我们会打电话给你”。

标签: dependency-injection smalltalk pharo


【解决方案1】:

有一种非常强调依赖注入的 Smalltalk 方言。它扩展了语言,不仅方法名而且类名都使用动态查找。类名的新颖查找与方法的查找最相似,不同之处在于它通过一系列嵌套类而不是沿继承链向上冒泡。因此,您可以通过更改嵌套环境来更改注入的类。

要了解有关方言的更多信息,请follow this link

【讨论】:

  • 是的,我知道新话。但是 Guice 让你注入的不仅仅是类名。您还可以使用它优雅地注入不同的数据库连接,具体取决于您是否正在测试(范围)。当然,您可以在新话中优雅地建模。但是,它本身并没有“范围”的概念,这对我的用例很有用。
【解决方案2】:

With Guice,看起来您定义类以将某些接口作为构造函数参数。然后你告诉 Guice“这个接口映射到实现该接口的那个类”。

这种东西在 Smalltalk 中完全没有必要,因为 Smalltalk 类只关心协议。

如果我们将示例翻译成 Smalltalk,我们可以将任何我们喜欢的对象传递给 RealBillingService 的构造函数,只要该对象响应 #logChargeResult: 和 #logConnectException:,即,只要该对象实现所需的协议一个事务日志。

Here's a link 与上述类似的答案。

【讨论】:

  • guice 所做的是,它根据配置将内容注入您的程序。例如,想想 SandstoneDB (onsmalltalk.com/…)。在那里,您编写“人员保存”以将人员对象写入磁盘。该人如何找到自己的数据库?它查找默认数据库的全局常量。这是一个优雅的 API,但对于测试来说很糟糕。 Guice 会给人们一个干净的方式来找到它的数据库。我向你保证,Guice 解决的问题不是由接口引入的。
【解决方案3】:

我不是真正的专家,但我在 google 上找到了这篇文章:http://codebetter.com/blogs/jeremy.miller/archive/2006/05/05/144172.aspx

我希望这会引导您朝着正确的方向前进。
:)

【讨论】:

  • 我自己也看到了。它指向两篇文章:一篇关于 DI,一篇关于 Smalltalk。但它并没有指向同时讨论这两者的任何事情。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 2014-09-06
  • 2010-09-14
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多