本記事では、ドメイン駆動設計において、デスクトップアプリでリポジトリの実装というテーマで書きます。
DDD本は、Webアプリをベースに書かれています。デスクトップアプリで実装した例は見つけられませんでした。
なので、オリジナルでデスクトップアプリにドメイン駆動設計を実装します。
本記事は、リポジトリの実装に着目しています。
以下のお絵描きアプリのサンプルで考えてみます。
- 左クリック中は、マウスの軌跡上に線を書く
- 線を選択して、delキーを押すと、線を削除する
- ユーザーが指定した場所に、お絵描きファイルとして保存する
- ユーザーが指定した場所から、お絵描きファイルを読み込む
このアプリケーションにおいて、リポジトリで実装する内容は以下のようになります。
- 描画している線情報の管理
- バイナリデータ→線情報に変換
- 線情報→バイナリデータに変換
描画している線情報の管理
リポジトリが線情報を追加、削除をできるようにします。インタフェースは以下のようになります。
/// <summary>
/// 描画リポジトリ
/// </summary>
public interface PaintRepository
{
/// <summary>
/// 線を追加する
/// </summary>
/// <param name="line">線</param>
void Add(Line line);
/// <summary>
/// 線を削除する
/// </summary>
/// <param name="id">ID</param>
void Delete(int id);
}
インタフェースの実装クラスにおいて、線情報はメモリで保持します。
DDD本だと、データベースに保存するのが正しいように思います。
が、データベースだと処理速度が気になりますし、プロジェクトとしてデータベースを使いたくない場合もあります。
一時的に保存するだけなので、メモリで十分です。
バイナリデータ→線情報に変換
ファイルからバイナリデータとして読み込んだものを線一覧クラスに変更します。
/// <summary>
/// 描画リポジトリ
/// </summary>
public interface PaintRepository
{
/// <summary>
/// 線一覧を設定する
/// </summary>
/// <param name="bytes">バイナリデータ</param>
void setLines(byte[] bytes);
}
重要なことは、ファイルの読み込みは、リポジトリでは行わないことです。
DDD本では、データベースからデータの読み込みを行うのはリポジトリの仕事と書いてあります。
今回は、あえてリポジトリでは行わないようにしました。理由は、ファイルの場所を管理しているのは、アプリではなくユーザーだからです。
ユーザーがファイルの場所を指定するので、ファイルの場所を管理するのはユーザーとなります。
リポジトリでファイルの読み込みを行う場合、ドメイン層が読み込むファイルパスを意識することになります。
詳しくは↓の記事を参考にしてください。
線情報→バイナリデータに変換
線情報をバイナリデータに変換します。変換したものをファイルに保存します。
リポジトリはバイナリデータの変換だけを行います。バイナリデータの保存は、リポジトリでは行いません。理由は先ほどと同じです。
/// <summary>
/// 描画リポジトリ
/// </summary>
public interface PaintRepository
{
/// <summary>
/// 線一覧のバイナリデータを取得する
/// </summary>
/// <returns>バイナリデータ</returns>
byte[] getLines();
}
まとめ
ドメイン駆動設計において、デスクトップアプリのファイルシステムにおいてリポジトリの実装というテーマで書きました。
お絵描きアプリを題材にして、リポジトリで実装する内容をまとめました。
以下参考にした書籍です。
コメント