web-dev-qa-db-ja.com

Scalaで依存性注入を行うにはどうすればよいですか?

私はまだ学習の始めにいますscalaに加えてJavaそして、私はそれを得ることができませんでした。既存のDIライブラリを使用する必要がありますか、手動で行う必要がありますか、それとも別の方法がありますか?

74
Fabian

標準Java DIフレームワークは通常Scalaで動作しますが、言語コンストラクトを使用して、外部依存関係なしで 同じ効果を達成 することもできます。

59
Dan Story

Scala=専用の新しい依存性注入ライブラリは、Dick Wallの SubCut です。

Dan Storyの回答で参照されているJonasBonérの記事では、コンパイル時のバインドインスタンスと静的インジェクション(ミックスイン経由)が強調されていますが、SubCutは、不変モジュールのランタイム初期化と、タイプ、文字列名、またはscala.Symbol名。

GettingStarted ドキュメントで、Cakeパターンとの比較について詳しく読むことができます。

14
Allan Erskine

依存性注入自体は、ツール、フレームワーク、コンテナのサポートなしで実行できます。コードからnewsを削除して、コンストラクターに移動するだけです。残る退屈な部分は、コンテナが大いに役立つ「世界の終わり」にオブジェクトを配線することです。

ただし、Scalaの2.10マクロを使用すると、コンパイル時に配線コードを生成でき、自動配線とタイプセーフを実現できます。

Scalaガイドの 依存性注入を参照してください

9
adamw

最近のプロジェクトは、コンストラクター注入のみに基づいたDIを示しています: zalando/grafter

コンストラクターインジェクションの何が問題になっていますか?

Scalaでは 依存性注入 を行うために 多くライブラリ または アプローチ があります。 Grafterは、コンストラクターインジェクションを使用するだけで、依存性注入の基本に戻ります:リフレクションなし、xmlなし、注釈なし、継承なし、自己型なし。

次に、Grafterは、コンストラクターインジェクションに必要なサポートだけを追加します。

  • 構成からコンポーネントベースのアプリケーションをインスタンス化する
  • 配線の微調整(シングルトンの作成)
  • コンポーネントを交換してアプリケーションをテストする
  • アプリケーションの開始/停止

Grafterは3つのアイデアの関連付けに焦点を当てているため、可能なすべてのアプリケーションを対象としています。

  • コンポーネントのケースクラスとインターフェイス
  • リーダーインスタンスと構成の不定形
  • ツリーの書き換えとその他すべてのためのkiama!
2
VonC

私自身はそうしていませんが、ほとんどのDIフレームワークはバイトコードレベル(AFAIK)で動作するため、任意のJVM言語で使用できるはずです。

1
Marcelo Cantos

以前の投稿でテクニックを取り上げました。 Scala言語の目的に関するMartin Oderskyの2014年5月の講演へのリンクを追加したかった。しかし、それは単なる意見です。あなたのScalaプロジェクトにDI依存関係を含めることは非慣用的ですが、これも意見です。実際に言えば、ネイティブに依存関係を注入すると、コンテナを使用することで一定の一貫性が得られますので、目的のために両方の観点を考慮する価値があります。

https://youtu.be/ecekSCX3B4Q?t=1154

1
Eric Aldinger

Dan Storyの回答に加えて、私は言語構成体のみを使用するDIバリアントについてブログに書きましたが、Jonasの投稿では言及されていません: Value Injection on Traits 。このパターンは私にとって非常にうまく機能しています。

0
rintcius

scala 2.10 here。 を使用して、非常に単純な機能的なDIコンテナーを作成する方法を示しました。

0
J Pullar