概要
FastAPIを用いて、開発をする際にDepends
の意味がわからなかったので、備忘録として書き残します。
依存関係の注入は何をしているのか?
→オブジェクトやリソースを関数やクラスに渡す方法の一つ
依存注入の役割
- リソースの管理
依存性注入により、リソースのライフサイクル管理を集中化できる。リソースの作成、初期化、破棄などを 依存関係の注入システムが担当するため、個々の関数やクラスがリソースの管理に関与する必要がなくなる。 - コードの再利用性と保守性の向上
依存関係がクラスや関数を明確にし、保守性を高めることができる。
例えば、下記のコードではget_db
関数の中で依存性の注入を行っている。SessionLocal()
でデータベースセッションを作成し、db.close()
でセッションを閉じる一連の流れを依存関係として定義することで、DB操作をする際に毎回、記述しなくても良くなり、コードの可読性が向上する。
from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session
from database import SessionLocal
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/users/")
def create_user(name: str, email: str, db: Session = Depends(get_db)):
...
Annotated()を使った依存注入
→ Python3.9以降で導入された、型ヒント機能
Dependsと同様に依存関係の注入に使用される。異なる点はメタデータを追加し、依存関係の動作を明確
にすることができる点である。
使用するメリット
型ヒントとメタデータを明示的に分離することができる。型ヒントの可動性が向上する。
- Annotatedを使用しない場合
型ヒントとメタデータを明示的に分離し、どの部分が型ヒントで、どの部分がメタデータなのかを明確に示すことができる。
db: Session = Depends(get_db)
- Annotatedを使用する場合
第1引数のSessionが型ヒントで、第2引数のDepends(get_db)がメタデータであることを明確に区別することができる。
db: Annotated[Session, Depends(get_db)]