Tec*_*mag 6 dependency-injection scala guice
我准备喝koolaid了:)
Play正在转向Google Guice(https://github.com/google/guice),所以我想我在这里没有真正的选择,只能标记为骑行.
不知怎的,我错过了一些东西.
我得到了"不要打电话给我们,我们会称呼你"的心态和依赖注入解决方案的核心原因 - 更少的脆弱和更可测试的代码.
然而有时我想要的只是一个简单的牙签而且不觉得需要烤蛋糕,或者更糟糕的是还要写一个完整的烘焙配方,只需要一个...
斯卡拉,这种语言似乎使得牙签工厂变得微不足道(Guice的一个论点是建造工厂的成本(用Java) - 所以对我来说这个论点至少不在谈论桌上,但这并没有否定DI的其余部分我知道的问题).
在斯卡拉你有一个同伴object(对不起有一个宁静的闪回 - 我需要片刻 - 好好去 - 哦,并责怪奥德斯基的那些词组合而不是我...).
对于Toothpick类:
case class Toothpick(color: Color)
object Toothpick {
def redPlease = {
Toothpick(Color.RED)
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以apply通过引用Toothpick"对象" 来获得您想要的精确牙签以及其他一些scala细节:
val myShinyRedToothpick = Toothpick.redPlease
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下Toothpick,它object是一个即时工厂.
轻松做事并不会让事情变得简单 - 只是让事情变得简单.
谷歌Guice的概述似乎是:一个工厂统治他们所有.
好的 - 我可以忍受这个.他们得到了他们的第一个 - 他们拥有所有的土地 - 我们将永远是佃农.游戏结束.
我需要的是如何使用 Guice'd up工厂的牙签示例.我如何从NORMAL Scala代码中获取我的牙签呢?
(就像我说的那样,我可能完全忽略了这一点......所以如果是这样的话,可以随意投掷任何猴子废话让我看向正确的方向).
PS:我不需要为什么教训- 我只想要一个如何.
所以嘿,这里有一个复杂的操作方法。(注意:未经测试且完全愚蠢的代码)
public class MyComplicatedGuiceModule extends AbstractModule {
protected void configure() {
// does some configuration stuff
}
@Provides
@Named("RedToothPick")
ToothPick provideRedToothPick() {
ToothPick(Color.RED)
}
@Provides
@Named("WhiteToothPick")
ToothPick provideWithToothPick() {
ToothPick(Color.WHITE)
}
}
Run Code Online (Sandbox Code Playgroud)
要在你的课堂上使用它,你可以这样做:
public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) {
}
Run Code Online (Sandbox Code Playgroud)
现在,可以公平地争论:为什么会变得复杂?看看Scala 代码使用的行数少了多少?
对我来说,最大的好处是测试实际代码。归结为:如何测试你的伴生对象?如果它调用一些随机服务怎么办?我们如何嘲笑这项服务?能够插入依赖项使得可以轻松地单独测试它们。
| 归档时间: |
|
| 查看次数: |
1053 次 |
| 最近记录: |