0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dependsによる依存性注入

Posted at

概要

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)]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?