Pythonのmockは簡単にモンキーパッチができます。使えばDIコンテナなしでもユニットテストできます。
でも、DIコンテナに慣れた体がIoCを求めるので、DIコンテナーを探すことにしました。
DIコンテナーの要件
こんなDIコンテナが欲しいです。
- タイプヒントから、コンクリートクラスを探して自動的に注入してくれる
- シングルトンか、毎回生成かを選べる
- インスタンス生成ファクトリを使用できる
- コンストラクタインジェクションかプロパティインジェクション(クラスがコンテナに依存しない)
DIコンテナを探す旅
PyPiでDI Containerを検索すると10,000以上ヒットします。
え、まさか、これ全部?
ぐぐると152件ヒットしました。
それでも多過ぎ!
ここは先達に頼りましょう。
Injector
紹介されていた記事です。
- PythonでのDependency Injection 依存性の注入
- PythonでDI(Dependency Injection)
- Python3.7でCrean Architectureを実現する
コンストラクタインジェクションになります。
要件を全て満たしているようで、これがよさげかもしれません。
PInjector
紹介されていた記事です。
上記Injectorの再実装っぽく見えます。
タイプヒントではなく、引数名で依存性を解決しているのかな?
autocontainer
タイプヒントで依存性解決してくれます。
シングルトンかどうかは、デコレータではなく、コードで指定します。
シンプルで必要にして十分かも。
その他
コンテナへ自前で登録しなければいけなかったり、別途設定が必要だったりで、要件にあわなかったライブラリです。