前回までで全体のプロジェクト構成と簡単なテストコードの記述まで行いました。今回は実際にデータベースなどとのテストを実施するときに必要なRepositoryの概念を解説します。Repositoryの後にMockやMoqを使ったテストの記述方法を解説していきます
Repository
リポジトリーとはアプリケーションが外部と接触するときに外部と接触するロジックと,接触しないロジックの境目に設置するインターフェースです。データベースから値を取得するケースでは,SQLを実行するして値を返すまでが外部と接触するロジックになり,このロジックは外部との接触に必要なロジックであり,ドメイン要素ではないため,それを切り分けるためにDomainとは別にInfrastructureに切り出します。RepositoryのインターフェスはDomain層に配置します。
最終的にはDomain層のインターフェースに対してInfrastructureが実装部分を記述し,UIよりDomain層にインターフェースに対して呼び出しをします。最上位のインターフェースに対してコードを記述し,InfrastructureとUIは抽象に依存する形になります。
要するに依存関係逆転の法則です。別に新しい技術ではありません。Domainプロジェクトに「Repositories」というフォルダを作成し,その中に「ISensorRepository」というクラスを作成します。
public interface ISensorRepository { float GetData(); }
Float値を返却するGetData()という関数を一つ定義します。GetDataという関数の中でどのような技術的な実装がされるかは今は後回しにしてとにかく読んだら「Float値を返してくれるもの」というくらいに思っておいてください。
それではMeasureViewModelの実装を続けます。最初にprivate変数としてISensorRepositoryを定義します。
private ISensorRepository _sensorRepository;
そしてMeasure()メソッドの中にこう書きます。
public void Measure() { var value = _sensorRepository.GetData(); MeasureValue = Math.Round(value,2) + “m/s”; }
今作ったリポジトリーのGetData()を呼び出すと,なんだかわかりませんが,Float値 (センサーの計測値を想定している)が返ってくるという定義をしたのでそれを呼び出し,取得した値に対して小数点以下2桁で丸めて単位「m/s」をくっつけています。
いったんこれでテストしましょう。残念ながらまだレッドバーですね。どこでNGになっているのかがわからなければ,テスト項目を選択してデバッグ実行してください。
NG箇所で処理が止まります。
ちなみに今やると
_sensorRepository.GetData()
でNullExceptionが発生しています。
当然sensorRepositoryは宣言しただけなのでNullです。
ここに何かインスタンスを生成しなければなりません。
では何を生成しましょう。
まだISensorRepository のインターフェースを作成しただけで具象クラスは作成していません。
どうしましょうか?
実際にセンサー接続を行う具象クラスをInfrastructure層に作りましょうか?
そんなクラスをNewしたら実際にセンサーにつながっていないとエラーになるのではないでしょうか?
データベースへの記述と同じですね。
最初に言った通り,テストしやすいコードにしなければなりません。
インターフェースの向こう側で,技術的な解決を行うコードは本番コードです。いずれ書かなければなりませんが,今は先送りにします。ドメインに集中しましょう。ではどうやってテストしましょうか?
Mockという概念とMoqというクラスライブラリを使って
解決していきましょう。
- C#でドメイン駆動開発とテスト駆動開発で保守性の高いプログラムを書く!1
- C#でドメイン駆動をする前に良いコードと悪いコードの定義を理解しよう!2
- C#でドメイン駆動開発をやるうえで採用するアーキテクチャーに関して3
- C#でドメイン駆動開発をするうえで意識べきロジックの2つの種類④
- C#でドメイン駆動開発 アーキテクチャーの実装とテスト駆動での書き方を解説5
- C#でドメイン駆動開発 外部との接触箇所にRepositoryを使う!⑥
- C#でドメイン駆動開発Moqを使ったテスト駆動開発のやり方を解説!⑦
- C#でドメイン駆動設計UIとインフラストラクチャーを実装する方法⑧
- C#でドメイン駆動開発 Entityの書き方と使い方とテスト駆動!⑨
- C#でドメイン駆動開発ValueObjectでプログラムの複雑さを取り除く⑩
- C#でドメイン駆動開発 ViewModelの中に明細項目があるときの実装⑪
- C#でドメイン駆動開発 データ保存時のロジックのMoqの書き方!⑫
- C#でドメイン駆動開発【DDD】エラー処理とExceptionの書き方!⑬
- C#でドメイン駆動開発をするうえで私が参考にした書籍ランキング!