前回はデータバインドの書き方を解説しました。しかし現状では,LatestViewModelのコンストラクタでコンパイルエラーが出ているため,先に進めていません。ここを解決する必要があります。
private LatestViewModel _viewModel = new LatestViewModel();
コンパイルエラーとなっているLatestViewModelの部分でF12を押下して,定義に移動すると,LatestViewModelのコンストラクタの第1引数でIMeasureRepositoryを求めていることが分かります。
public LatestViewModel(IMeasureRepository measureRepository) { _measureRepository = new MeasureRepository(measureRepository); }
IMeasureRepositoryは実際には外部接触をするのでRepositoryにしているため,最終的にはデータベースに接続するクラスを作成し,データベースから値を取得することになります。しかし,ドメイン駆動開発では,データベース設計よりも先にドメイン部分を作成する狙いもあるので,データベース設計がされる前に,コーディングをしてもいいのです。ある程度ドメインを作成した後,それをもとにデータベースを設計すれば,無駄のないデータベース設計になりますし,データベースに接続しなくても動作するプロトタイプも同時に出来上がります。
今回は,データベースに接続しなくても,ViewModelとDomain部分の実装を進めていけるように,Fakeという考え方を解説します。Fakeを使うことでInfrastructure層の実装を遅らせ,外部接触する部分以外をどんどん作成していくことができます。
Fakeとはダミーデータを返すクラスです。外部と接触するためInfrastructure層に記述していきます。
不要なクラスの削除
それではFakeクラスを作成していきますが,その前に,Infrastructure層にデフォルトで作成されているClass1クラスは不要なので削除しましょう。Class1.csを選択してDeleteキーを押下します。
Fakeフォルダーの作成
Infrastructure層にFakeフォルダーを作成します。
Infrastructureのプロジェクトを右クリックして,「追加」「新しいフォルダー」の順に選択し,フォルダーを作成します。
作成されたフォルダーの名前を「Fake」としてください。
Fakeクラスの作成
作成したFakeフォルダーに,Fakeクラスを作成します。Fakeクラスとは,今回であれば,IMeasureRepositoryを使うクラスを作成し,ViewModelでそのクラスを呼び出すことで,ダミーデータを取得します。クラス名を「MeasureFake」とします。命名の方法は「IMeasureRepository」のFake版なので,「Measure」の語尾に「Fake」を付けます。実際は「Measure」がデータベースのテーブル名になります。データベースに接続するクラスを作る際は「MeasureSqlServer」という感じで,「Measure」の後にテクノロジー名を付けます。Oracleなら「Oracle」を語尾に着けることで,外部のどのテクノロジーと接触するかを表現します。今回はFake版なので,語尾にFakeと付けます。
作成した「Fake」フォルダーを右クリックして,「追加」「クラス」の順で選択し,フォルダーの中にクラスを作成します。
クラス名は「MeasureFake」にて「追加」ボタンでクラスを作成します。
これで「MeasureFake」クラスが作成されました。
MeasureFakeクラスのコーディング
作成されたMeasureFakeクラスに,次のように記述します。
using NDDD.Domain.Ripositories; namespace NDDD.Infrastructure.Fake { public class MeasureFake : IMeasureRepository { } }
最初に「using NDDD.Domain.Ripositories」を付けている点に注意してください。 IMeasureRepositoryの部分が赤い波線でコンパイルエラーになっていると思います。IMeasureRepositoryが強制するGetLatestメソッドを記述していない為です。手動で記述してもいいのですが,IMeasureRepositoryを選択し,ctrl+ドットキーを押下して,Enterを押せば,自動でGetLatestメソッドが生成されます。
using NDDD.Domain.Entities; using NDDD.Domain.Ripositories; namespace NDDD.Infrastructure.Fake { public class MeasureFake : IMeasureRepository { public MeasureEntity GetLatest() { throw new System.NotImplementedException(); } } }
同時に「using NDDD.Domain.Entities;」も作成されていることに注意してください。自動生成がうまくいかない場合は,IMeasureRepositoryの波線の上にカーソルをあてて「インタフェースを実装します」を選択するか,手動で記述してください。
LatestViewでMeasureFakeを生成する
ここまでくれば,LatestViewのコンパイルエラーを消すことができます。今作成したMeasureFakeのインスタンスをLatestViewModelのコンストラクタの第1引数に設定すれば,コンパイルエラーは解消します。
using NDDD.Infrastructure.Fake; using NDDD.WinForm.ViewModels; using System.Windows.Forms; namespace NDDD.WinForm.Views { public partial class LatestView : Form { private LatestViewModel _viewModel = new LatestViewModel(new MeasureFake()); public LatestView() { InitializeComponent(); AreaIdTextBox.DataBindings.Add("Text", _viewModel, nameof(_viewModel.AreaIdText)); MeasureDateTextBox.DataBindings.Add("Text", _viewModel, nameof(_viewModel.MeasureDateText)); MeasureValueTextBox.DataBindings.Add("Text", _viewModel, nameof(_viewModel.MeasureValueText)); } } }
LatestViewのLatestViewModelのインスタンスを生成する部分で,今作成したMeasureFakeのインスタンスを生成して引き渡します。これで,画面からViewModelを呼び出したときは,Fakeが呼び出されるようになりました。 この状態で実行すると,LatestViewModelがデータを取得するときはMeasureFakeに接続されることになるので,あとはMeasureFakeにダミーのデータを返却するように記述すれば,画面にダミーデータを表示させることができるようになります。次回はそのあたりを見ていきたいと思います。