Open10

Django DDD with Onion Architecture

kathmandukathmandu

DJangoはモデルが秩序なく利用されるため難しさを抱える

kathmandukathmandu

wf-yamaday/dllab-ddd-sample: エンタープライズAIとモダンアプリケーション開発の実践〜ISID ✕ Microsoft〜 #2での「AI組織でのアプリケーション開発の裏側 - Django × DDDでの開発プラクティス」セッションで紹介したコードを置いているリポジトリです。

  • from_domain, to_domain を、Modelにもたせるといい設計になりそう
from django.db import models
from fa_analysis.domains.analysis import Analysis as DomainAnalysis
from fa_analysis.domains.answer import FreeAnswer as DomainFreeAnswer
from fa_analysis.domains.token import Token as DomainToken


class Analysis(models.Model):
    """Domain層のAnalysisとマッピングされるDjangoモデル"""

    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=256)

    @classmethod
    def from_domain(cls, obj: DomainAnalysis) -> "Analysis":
        """ドメインモデルからのファクトリメソッド"""
        return cls(id=obj.id, name=obj.name)

    def to_domain(self) -> DomainAnalysis:
        """Djangoモデルからドメインモデルに変換するメソッド"""
        return DomainAnalysis(
            id=self.id,
            name=self.name,
            answers=[a.to_domain() for a in FreeAnswer.objects.filter(analysis=self)],
        )

kathmandukathmandu

Repositoryパターンとは永続化を隠蔽するためのデザインパターン

kathmandukathmandu

Python + FastAPIでオニオンアーキテクチャ(簡易版)
test_get_prompt_by_cat_id.py — ai-cat-api [GitHub] — Visual Studio Code — GitHub

  • AI実装あり
  • オニオンアーキテクチャの説明がわかりやすい
  • application層をusecase層という命名にするとわかりやすくなる
  • コードは好みではない
    • 型の名前が長くてちょっと分かりづらい
    • ディレクトリの切り方・ファイルの分け方が好みではない
  • testあり
kathmandukathmandu

Python で学ぶ実践的なドメイン駆動設計とレイヤードアーキテクチャ / DDD and Onion Architecture in Python - Speaker Deck
README.ja_JP.md — dddpy [GitHub] — Visual Studio Code — GitHub

  • DTOがDAOも兼ねている(DB(sqlalchemy)に依存しているのは違和感)
  • from_enitity, to_entity を参考にした
  • XXXアーキテクチャ = DDD ではないことを教えてくれた
  • 設計が大事!先にインターフェースを決めて、実装はあと! <- 重要
  • CQRSの話
    • Command Query Reeponsibility Segregation
    • 参照系(Query) と 更新系(Command)を分離しようねってこと
    • つまり、fastapiでは、ReadModelとCreateModel, UpdateModelを別で定義しておこうねってことかな? <- 以前から実装済み
  • UoWの話
    • Unit of Works
    • DBのトランザクションやろうねってこと
  • testあり
  • リポジトリはきれい
    • だが、やはりDTOがsqlalchemyに依存(密結合)しているのが違和感
    • exceptionsのエラーメッセージをdomainに記載している偉い例