DIコンテナ

DIコンテナとは、アプリケーションにDI(Dependency Injection: 依存性注入)機能を提供するフレームワークです。

依存性注入とはソフトウェアのうち、外部の環境などに依存する部分(データへのアクセスなど)を切り離し、 ソフトウェアの外部から提供できるようにするという考え方です。

共有型TODO管理アプリケーションを例にすると、これまでは以下のようにActionがEntityManagerに直接アクセスしていました。 この構造の場合、開発中など、データベースアクセスせず、仮のオブジェクトにアクセスするようにしたい場合はActionを修正しなければなりません。

ここまでの処理

DIコンテナを使用する場合、以下のように、インタフェースRepositoryを追加し、 Actionはそのインタフェースに対してアクセスするように処理を実装します。 DIコンテナは、インタフェースに対する実装の選択機能を提供します。

これにより、開発中はテスト用にデータはメモリ上に格納、参照するようなMockRepositoryクラスを使用し、 運用時には実際にデータベースにアクセスするようなDBRepositoryクラスを使用することができ、 実際のデータベースにアクセスできない環境でも開発をおこなえるようになります。

DIコンテナ

DIコンテナには以下のようなものがあります。
ここでは、Guiceを例にDIコンテナを使用してみましょう。


Guiceの概要

Guiceは、Googleが開発・配布しているDIコンテナです。
非常にシンプルな構造が特徴です。

Guiceでオブジェクトを実装する場合、以下のようなクラスを作成する必要があります。

クラス/インタフェース 役割
サービスのインタフェース 依存オブジェクトのインタフェースを定義します。
サービスの実装クラス 依存オブジェクトを定義します。サービスのインタフェースを実装する必要があります。
クライアントクラス サービスを使用するクラス。サービスのインタフェースのオブジェクトへの参照を持ちます。

以下の手順でGuiceの処理を呼び出すことで、クライアントクラスとサービスの実装クラスの関連付けをおこなうことができます。

  1. Binderにサービスのインタフェースとサービスの実装クラスの対応付けを登録する。
  2. Injectorにクライアントクラスのインスタンス化を依頼する。
    このとき、クライアントクラスにはサービスの実装クラスのインスタンスが渡されます。


Guiceを使った依存オブジェクト切り離し

では、実際にGuiceを利用してDIコンテナを利用したアプリケーションを実装してみましょう。
Guiceを使った依存オブジェクト切り離し


演習:作業項目テーブルアクセス部分の分離

作業項目テーブルにアクセスしている部分を依存部分として切り離してみましょう。

演習:作業項目テーブルアクセス部分の分離