Dependency Injection (DI) の基本
コンストラクタインジェクションとは?
コンストラクタインジェクションは、依存関係をクラスのコンストラクタを通じて注入する方法です。具体的には、クラスが必要とする依存関係を、コンストラクタの引数として受け取ることによって実現されます。
- コンストラクタインジェクションの利点
明確性: コンストラクタで必要な依存関係が明示されるため、クラスの動作に必要なものが一目でわかります。
不変性: 一度インジェクションされた依存関係は変更されないため、安全性が向上します。
テスタビリティ: モックオブジェクトやスタブを簡単に注入できるため、ユニットテストが書きやすくなります。 - Pythonにおける実装例
以下は、Pythonを使ったコンストラクタインジェクションの簡単な例です。
class Database:
def save(self, data):
# データ保存のロジック
pass
class UserService:
def __init__(self, db: Database):
self._db = db
def add_user(self, user_data):
self._db.save(user_data)
# 使用例
db_instance = Database()
user_service = UserService(db_instance)
user_service.add_user({"name": "John Doe", "email": "john@example.com"})
Database クラスの定義
このクラスはデータベースに関連する処理を模倣しています。
save メソッドは、データをデータベースに保存する機能を模しています。ここでは具体的な実装は省略されており、実際にはデータベース接続やデータの保存ロジックがこの中に書かれることになります。
UserService クラスの定義
このクラスは、ユーザーに関連する処理を担当します。
コンストラクタ init は、Database のインスタンスを引数として受け取ります。これがコンストラクタインジェクションの核心部分です。UserServiceはDatabaseの機能に依存していますが、直接インスタンスを生成するのではなく、外部からインスタンスを受け取る形となっています。
add_user メソッドは、ユーザーデータをデータベースに保存するために、内部でDatabaseのsaveメソッドを呼び出します。
使用例部分
まず、Database クラスのインスタンス db_instance を作成します。
次に、この db_instance を引数として UserService クラスのインスタンス user_service を作成します。この時点で、UserService の内部には Database のインスタンスが注入されています。
最後に、user_service の add_user メソッドを呼び出し、ユーザーデータをデータベースに保存します。このメソッド内部で、前述した Database の save メソッドが呼び出されることになります。