Spring4Dの紹介
第28回 エンバカデロ・デベロッパーキャンプ
2014/04/22
株式会社ビープラウド 岡野真也
今日紹介するのは
Spring4D
→Spring Framework for
Delphi
の
主にDIコンテナ
“Spring Framework”
→Javaのアプリケーショ
ン
フレームワーク
Spring4Dの機能
Spring4Dの機能
• 便利なクラスライブラリ
• 一般的な型
• インターフェースベースのコレクション
型
• リフレクション拡張
• など…
•DIコンテナ
開発元やライセンスなど
• オープンソースプロジェクト
• https://bitbucket.org/sglienke/spring4d
• ライセンス
• Apache License 2.0
• 対応Delphiバージョン
• 2010~XE6
“DI”
→Dependency Injection
(依存性の注入)
Dependency Injection (依存性の注入)
• ソフトウェアデザインパターン
• コンポーネント(ユニットやクラス)間の
依存関係をソースコードから取り除く
• 外部の設定などで依存関係を注入する
ユニットやクラス間の
依存関係
例. 計算機アプリ
TCalculator
uCalculator.pas
TMathService
uMathService.pas
uses uMathService;
service := TMathService.Create;
• TMathServiceは計算処理を行う
• uMathService.pas
• TCalculatorは値の入出力と橋渡し
• uCalculator.pas
• TCalculatorはTMathServiceを利用
• →uCalculator.pasは
uMathService.pasに依存
欠点
依存関係がある場合の欠点
• 再利用しにくい
• 単体テストしにくい TCalculator
uCalculator.pas
TMathService
uMathService.pas
uses uMathService;
service := TMathService.Create;uCalculatorだけをテストしたい
が
uMathServiceも必要となる
TMathServiceを別の処理に差し
替えたいが、uCalculator.pasを
編集しないといけない
DIコンテナを利用して
依存関係を除去する
Spring.Container.TContainer
Spring.Container.TContainer
• Spring4DのDIコンテナ
• クラス登録
• TContainer.RegisterComponent<T>.Implements<I>
• クラス/インスタンス取得
• TContainer.Resolve<I>
DIコンテナを利用して
依存関係を除去する
// コンテナから計算処理クラスのインスタンスを
取得
service := Container.Resolve<IMathService>;
• インターフェースを用
意
• DIコンテナを用意
uServiceLocator.pas
TContainer
uServiceLocator.pas
uServiceLocator.pas
IMathService
uMathServiceIntf.pas
uServiceLocator.pas
TMathService
uMathService.pas
実装クラス登録 インターフェース利
用
• インターフェースを実装
• 実装クラスをコンテナに
登録(依存性の注入)
uServiceLocator.pas
TCalculator
uCalculator.pas
インスタンス取
得
インターフェース利
用
• コンテナから実装クラ
ス(のインスタンス)を
取得
依存性を除去できました
依存度が低いと
実装の差し替えも簡単です
実装の差し替え例
• TMathServiceをRPCで処理
するTRemoteMathService
に差し替える
uServiceLocator.pas
TContainer
uServiceLocator.pas
uServiceLocator.pas
IMathService
uMathServiceIntf.pas
uServiceLocator.pas
TCalculator
uCalculator.pas
インスタンス取
得
インターフェース利
用
uServiceLocator.pas
TMathService
uMathService.pas
実装クラス登録 インターフェース利
用
uServiceLocator.pas
TRemoteMathS
ervice
uRemoteMathService.
pas
実装クラス登録 インターフェース利
用
ユニットを差し替えるだ
け!
便利なので試してみてね!
サンプルコード
http://bit.ly/devcamp28-spring4d
時間があればデモ
まとめ
• Spring4DにはDIコンテナが含まれている
• DIコンテナを使うとクラス間の依存性を除去で
きる
• 依存性を除去することでクラスの再利用や実装
の差し替え、テストが容易になる
参考
• Getting Giddy with Dependency Injection and
Delphi Spring #5 – Delphi Spring Basics
• https://bitbucket.org/sglienke/spring4d
詳しくはDelphiTalks
で。
第7回 Delphi Talks @東京
• 日時: 2014/04/26(土) 13:30 〜 17:30
• 場所: 株式会社ビープラウド 会議室(新宿)
• 参加申込み:
• http://connpass.com/event/6021/
• facebook上のイベント
• MLやフォーラムの案内への返信でもok
ご清聴ありがとうございまし
た

Spring4Dの紹介