私はまだ学習の始めにいますscalaに加えてJavaそして、私はそれを得ることができませんでした。既存のDIライブラリを使用する必要がありますか、手動で行う必要がありますか、それとも別の方法がありますか?
標準Java DIフレームワークは通常Scalaで動作しますが、言語コンストラクトを使用して、外部依存関係なしで 同じ効果を達成 することもできます。
Scala=専用の新しい依存性注入ライブラリは、Dick Wallの SubCut です。
Dan Storyの回答で参照されているJonasBonérの記事では、コンパイル時のバインドインスタンスと静的インジェクション(ミックスイン経由)が強調されていますが、SubCutは、不変モジュールのランタイム初期化と、タイプ、文字列名、またはscala.Symbol名。
GettingStarted ドキュメントで、Cakeパターンとの比較について詳しく読むことができます。
依存性注入自体は、ツール、フレームワーク、コンテナのサポートなしで実行できます。コードからnew
sを削除して、コンストラクターに移動するだけです。残る退屈な部分は、コンテナが大いに役立つ「世界の終わり」にオブジェクトを配線することです。
ただし、Scalaの2.10マクロを使用すると、コンパイル時に配線コードを生成でき、自動配線とタイプセーフを実現できます。
Scalaガイドの 依存性注入を参照してください
最近のプロジェクトは、コンストラクター注入のみに基づいたDIを示しています: zalando/grafter
コンストラクターインジェクションの何が問題になっていますか?
Scalaでは 依存性注入 を行うために 多くライブラリ または アプローチ があります。 Grafterは、コンストラクターインジェクションを使用するだけで、依存性注入の基本に戻ります:リフレクションなし、xmlなし、注釈なし、継承なし、自己型なし。
次に、Grafterは、コンストラクターインジェクションに必要なサポートだけを追加します。
- 構成からコンポーネントベースのアプリケーションをインスタンス化する
- 配線の微調整(シングルトンの作成)
- コンポーネントを交換してアプリケーションをテストする
- アプリケーションの開始/停止
Grafterは3つのアイデアの関連付けに焦点を当てているため、可能なすべてのアプリケーションを対象としています。
- コンポーネントのケースクラスとインターフェイス
- リーダーインスタンスと構成の不定形
- ツリーの書き換えとその他すべてのためのkiama!
私自身はそうしていませんが、ほとんどのDIフレームワークはバイトコードレベル(AFAIK)で動作するため、任意のJVM言語で使用できるはずです。
以前の投稿でテクニックを取り上げました。 Scala言語の目的に関するMartin Oderskyの2014年5月の講演へのリンクを追加したかった。しかし、それは単なる意見です。あなたのScalaプロジェクトにDI依存関係を含めることは非慣用的ですが、これも意見です。実際に言えば、ネイティブに依存関係を注入すると、コンテナを使用することで一定の一貫性が得られますので、目的のために両方の観点を考慮する価値があります。
Dan Storyの回答に加えて、私は言語構成体のみを使用するDIバリアントについてブログに書きましたが、Jonasの投稿では言及されていません: Value Injection on Traits 。このパターンは私にとって非常にうまく機能しています。
scala 2.10 here。 を使用して、非常に単純な機能的なDIコンテナーを作成する方法を示しました。