DI コンテナがコードに出現するのは dependency lookup が行われている兆候
@d_akatsuka テストに DI コンテナが登場するのは、 dependency injection ではなく dependency lookup になってしまっている兆候ではないでしょうか (もっと粒度の大きいテストの話だったらすみません)
2013-05-10 10:39:23@t_wada 複数のリポジトリからデータを取得してごにょごにょするサービスクラスを作っているのですが、リポジトリの取得がコンテナ経由になってしまうんですよね…。Smyfony2は良いFWだと思うのですが、如何せん情報が少なくて試行錯誤してます
2013-05-10 10:45:13@d_akatsuka サービスクラスにコンストラクタやセッターを定義して、 DI 定義で constructor injection や setter injection するのはいかがでしょう http://t.co/hIf0boFS1w
2013-05-10 10:50:53@t_wada 今はSetter injectionでコンテナを突っ込む形にしているのですが、コンテナではなく必要なものだけ(例えばdoctrine)をinjectするべきという事でしょうか
2013-05-10 11:06:29@d_akatsuka そのとおりです。DI の大事なところは lookup の知識をプロダクトコードから排して全体の複雑性を下げることです。必要なものを探すのではなく、与えてもらう構造を作ります。今回で言えば、リポジトリ二つのセッターがあればそれで済む、というのが良い状態ですね
2013-05-10 11:11:02@d_akatsuka @t_wada Symfony2/Doctrineの場合ちょっと特殊でエンティティリポジトリはDoctrine EntityManager経由で取得しないといけないんですよね。
2013-05-10 11:20:40@d_akatsuka @t_wada (つづき) なので、サービスクラスにEntityManagerをインジェクトし、サービスクラス内ではEntityManagerからリポジトリオブジェクトを取得する形で折り合いをつけています。
2013-05-10 11:22:09@hidenorigoto @d_akatsuka なんと、そうでしたか…! では EM を inject するしかないんですかね。なかなか悩ましいですね。
2013-05-10 11:22:59@t_wada @hidenorigoto お、Doctrineは特殊なんですね。。。大変参考になりました。setEntityManage()を作って試してみますー
2013-05-10 11:28:08@t_wada @hidenorigoto @d_akatsuka DI 定義の factory_service を使えばインジェクションできますよ。
2013-05-10 11:36:15@t_wada @hidenorigoto @d_akatsuka ただ、サービスクラス等で結局 $em->flush() 等を使うので EntityManager だけでもいいと思いますが、より明示的にしたければそれぞれをインジェクションするのが良いかと思います。
2013-05-10 11:38:23@iteman @hidenorigoto @d_akatsuka 補足ありがとうございます。私はできるだけ lookup を排したいので、明示的にそれぞれ injection するのが好みだなと思いました。
2013-05-10 11:45:20Doctrine ベースのリポジトリを DI サービスとして定義する例 https://t.co/foU59zqExL #symfony #doctrine
2013-05-10 11:55:59@t_wada @hidenorigoto @d_akatsuka そうですね、私も明示的にインジェクションする方が良いと考えています。
2013-05-10 12:05:59@t_wada Dependency lookupをするとなんでいかんのか、っていう点もこの話の流れに必要な気がしました。JavaでいうPOJOではなくなるからイカンっていうこと(移植性)や、テストのセットアップフェーズにコンテナも作らないかん(スローテストへの第一歩)とか。
2013-05-13 15:58:19@t_wada ありがとうございます。先人が踏んだ地雷を避けられるとみんなハッピーになれるから、こういうノウハウは共有したいですねー。って検索したらこんなスライドが…。http://t.co/COYoYcCHm0 いろいろありがとうございます。
2013-05-13 16:02:42