きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Repositoryパターン × ノ × チョウサ

この記事の目的

この記事では、
Repository Patternとは何かを考えること
を目的としています。

本題

★Repositoryパターンの目的

Repositoryパターンの目的は、「データアクセス処理」と「ビジネスロジック」を分離することです。
Mirosoft Docsでは、以下のように記載されています。

"リポジトリ パターン" とは、データのアクセスをインターフェイスの抽象化の背後に分離する設計パターンです。 データベースへの接続やデータ ストレージ オブジェクトの操作を、インターフェイスの実装によって提供されるメソッドを使用して実行します。その結果、データベースに関する問題 (接続、コマンド、閲覧者など) に対処するためにコードを呼び出す必要が生じません。

引用元:
ASP.NET Core でのリポジトリ パターン | Microsoft Docs


★(個人的に)よく使うアプリケーション実装パターンとの違い

アプリケーション開発に携わるようになってから今まで作ってきたアプリは、大体次ような構造で設計されていました。
プレゼンテーション層で画面(ユーザーが操作するところ)の表示制御を行い、
ビジネスロジック層で、業務的な計算や集計処理を行い、
データアクセス層で、SQL文を構築しDBにクエリを発行する。
それら3つの層の間を必要な情報を格納されたインスタンス(ビジネスEntity層)が行き来して情報をやり取りする。
という構成です。

f:id:kinakomotitti:20180821224937p:plain
この図にむりやりリポジトリパターンを当てはめてみると、以下のようになると思います。
f:id:kinakomotitti:20180821224931p:plain
ビジネスロジック層では、データベースなどのリソースを意識せず、ビジネス処理を実装することができます。また、リポジトリは、インターフェースさえ実装しておけばよいので、テスト用のモックを作成しておくことができ、ビジネスロジック単体テストが楽にできるようになります。

★Repositoryパターンのスタンダードな実装方法

スタンダードな実装はMSのDocsで紹介されているものになるのでしょうか。
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/repository-pattern?view=aspnetcore-2.1:embed:ite


★メリット
  • ビジネス層とデータ アクセス層の間の依存関係がなくなるため、アプリの構成が簡素になります。
  • ビジネスロジックを実装・テストする際、データベースを意識せずに作業を進められます。
  • データベースへのアクセス コードが 1 つまたは複数のリポジトリによって一元的に管理されるため、コードの再利用が簡単になります。
  • データベース層から独立してビジネス ドメイン単体テストできます。
★デメリット

これといったデメリットが出てこない・・・
調査不足ですねw
単純に調べ切れていないだけだと思いますが、気になったことをメモしておきます。

 従来の3層構造の場合、多くはビジネスロジック層でトランザクションを管理していましたが、Repositoryパターンではどこで管理することになるのでしょうか・・・

  • 複雑なデータアクセスが必要な場合とそうでない場合の実装。

 すべてのデータアクセス処理をリポジトリに集約すればいいのか・・・そうではないのか・・・

 ベストプラクティスが見えない(-_-メ)

☆実際の使われ方

Log4netでも使われていました。Log4netのRepositoryパターン適用例(クラスの依存関係)は以下の通りです。
f:id:kinakomotitti:20180821224913p:plain
ここで、[ILoggerRepository]は、[Ilog]というインターフェースの実装クラスの情報を取得するために利用されます。※IlogはLog出力処理を司るクラスです。このRepositoryを介して取得したインスタンスを利用してログの出力メソッド(Info,Warnなど)を呼び出すことができるようになります。
Log4netでは、データベースから情報を取得するのではなく、設定ファイル(app.configやlog4net.config)から情報を取得します。DBだけにとらわれず、いろいろな「情報」を定義しているリソースからの取得処理と、ビジネスロジックとの分離ができそうということが見て取れます。

まとめ

  • Repositoryパターンは、「ビジネスロジック」と「情報取得処理」を分離するデザインパターンの1種。
  • 実際の使われ方はlog4netを参考にさせていただく。
  • DBアクセス処理だけではなく、設定ファイルからの情報取得にも利用できそう。