本記事では、ダイアログボックスでファイルを開く処理をドメイン駆動設計で実装します。
私は、デスクトップアプリケーション + ファイルシステムでドメイン駆動設計を実装しています。ところが、書籍やインターネットのドメイン駆動設計に関する情報は、Webアプリケーションでデータベースを使用するものばかりです。
なので、オリジナルで設計しました。
以下のケースを考えてみます。
- ファイルダイアログからファイルを選択する
- 選択したファイルを読み込む
- ファイルの内容を画面に反映する
ファイルの内容の読み込みはユーザー層で実装する
実装は以下のようになると思います。↓の記事を参考にざっくりブロック図を描いてみました。
大事なことは、ファイルダイアログの実装、ファイルの読み込み処理は、ユーザー層で実装することです。リポジトリ層でファイルの読み込みはしません。
ファイルパスをユースケースに渡さない
リポジトリは、データベースからデータを取り出し、ドメインオブジェクトを再構築するものです。
なので、ファイルの読み込みはリポジトリで行うものと思ってました。バイナリ配列は、リポジトリでラッピングされるべきと思ってました。
しかし、以下の図の通り、この方法だと、ユースケース層がファイルパスを意識することになってしまいます。
ファイルパスはファイルシステム固有のものです。ユースケース層、ドメイン層では意識したくないです。
仮にファイルシステム→データベースに変更することになった場合、ユースケース層、ドメイン層の変更はしたくないです。
ファイルの読み込みをリポジトリで行わないことに違和感があります。それでも、ファイル読み込みはユーザー層で行うべきです。
Webアプリケーションで考えてみる
このケースをWebアプリケーションで考えてみました。Webアプリケーションでもローカルのファイル内容をサーバーに反映させるケースはあると思います。
Webアプリケーションの場合は、前章の図の、UI部分がWebブラウザー、それ以外の部分がWebサーバーに組み込まれます。
Webアプリケーションの場合、WebブラウザーとWebサーバーそれぞれにデータベースを持っています。
デスクトップアプリケーションは、ユーザー層とそれ以外の階層に対しそれぞれにデータベースを持っていると考えることができます。
そのように考えると、ユーザー層でファイルの読み込みを行うことは自然なことのように思います。
まとめ
ダイアログボックスでファイルを開く処理をドメイン駆動設計で実装しました。
ファイルの読み込みはリポジトリではなく、ユーザー層で実装するほうがしっくりきます。
ファイルパスはユースケース層やドメイン層で意識しないようにするべきです。
コメント