M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

DIフレームワークGuiceについて

最近、仕事の都合でしらべることになった、DIフレームワークについて。
GoogleGuiceプロジェクトのイントロダクションの文書を転載しておきます。

原典は“Getting Started”(2011/06/01 9:45取得)です。

******************************

はじめに

依存性注入により、オブジェクトはそれらのコンストラクター内に依存性を受け入れます。あるオブジェクトを生成するには、まずそのオブジェクトの依存性を構成します。そしてそれぞれの依存性の構成には、その〔依存対象の〕それぞれの依存性が必要です。ですからあるオブジェクトをつくるときには、実際上、オブジェクト・グラフ(オブジェクトおよびそれらの関係)をもつくらなくてはならないのです。

手作業でオブジェクト・グラフを構成するのは、過酷な労働、不具合を起こしがちな傾向、そしてテスト実施の難しさの原因となります。これに対してGuiceはオブジェクト・グラフを〔自動的に〕構成してくれます。しかしGuiceがオブジェクト・グラフを構成するために、まず必要な設定をしなくてはなりません。

説明のため、RealBillingServiceクラスからはじめましょう。このクラスはそのコンストラクタ内でCreditCardProcessorとTransactionLogという2つのインターフェースへの依存性を内包しています。RealBillingServiceのコンストラクタがGuiceにより実行されることを明示するため、@Injectアノテーションを加えます:

class RealBillingService implements BillingService {
  private final CreditCardProcessor processor;
  private final TransactionLog transactionLog;

  @Inject
  RealBillingService(CreditCardProcessor processor, 
      TransactionLog transactionLog) {
    this.processor = processor;
    this.transactionLog = transactionLog;
  }

  @Override
  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
    ...
  }
}

RealBillingServiceを構成するには、PaypalCreditCardProcessorとDatabaseTransactionLogを使用する必要があります。Guiceはそれらの実装にマップ型オブジェクトへのバインディングを使用します。モジュールModuleはFluentインターフェース──英語的なメソッドコール──を用いたバインディング・コレクションです:

public class BillingModule extends AbstractModule {
  @Override 
  protected void configure() {

     /*
      * このメソッドコールはGuiceに対して次のように指示しています。
      * TransactionLogに対する依存性について見る場合にはいつでも、
      * DatabaseTransactionLogを使用して依存性条件を満たすこと。
      */
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);

     /*
      * 同様に、このバインディングはGuiceに対して次のように指示しています。
      * CreditCardProcessorが必要とされているところでは、
      * PaypalCreditCardProcessorを用いること。
      */
    bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
  }
}

モジュールはインジェクター──Guiceのオブジェクト・グラフ構成機──を構成するブロックです。はじめにこのインジェクターを作成し、 しかるのちにRealBillingServiceを組み立てるために使用するのです。

 public static void main(String[] args) {
    /*
     * Guice.createInjector()メソッドは開発者が用意したモジュールを引数にとり、
     * 新しいインジェクター・インスタンスを返します。
     * すべてのアプリケーションはそのmain()メソッド
     * 〔もしくはこれに類するエントリーポイント〕の中で、
     * 1回だけこのメソッドを呼び出します。
     */
    Injector injector = Guice.createInjector(new BillingModule());

    /*
     * さてインジェクターは手中にしましたから、
     * 次にオブジェクトを組み立てていきます。
     */
    RealBillingService billingService = injector.getInstance(RealBillingService.class);
    ...
  }

billingServiceの構築を例にとって、Guiceを使用した小さなオブジェクト・グラフの構成を見てきました。このグラフは請求サービス(billing service)とそれが依存するクレジットカード・プロセッサーと取引ログを含んでいます。

******************************

原典:“Getting Started”(2011/06/01 9:45取得)