前回はデータバインドの書き方を解説しました。しかし現状では,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にダミーのデータを返却するように記述すれば,画面にダミーデータを表示させることができるようになります。次回はそのあたりを見ていきたいと思います。
#02_プロジェクトの追加
#03_依存関係
#04_ドメイン駆動開発でApplication層は必要?
#05_Domainのフォルダー構成
#06_Infrastructureのフォルダー構成
#07_WinFormのフォルダー構成
#08_Testsのフォルダー構成
#09_テスト駆動で実装するための事前準備
#10_テストコードとViewModelの追加
#11_テストコードを追加する
#12_ Repositoriesフォルダーの作成
#13_ Entitiesフォルダーの作成
#14_ Mockの作成
#15_フォーム画面の作成
#16_画面のコントロールデータバインドする
#17_Fakeを使ってタミーデータを画面に表示させる
#18_Fakeデータを画面に通知する
#19_PropertyChangedの方法を変更する
#20_Fakeとデータベースの値を切り替える方法
#21_Sharedクラスを作成する
#22_クラスを生成するファクトリークラスを作る
#23_#if DEBUGでFakeデータがリリースされないようにする
#24_DEBUGモードであることをわかりやすくしておく
#25_Factories以外から生成できないようにしておく
#26_Factoriesの呼び出しはViewModelで行う
#27_外部の設定ファイルの値で判断する
#28_Fakeデータを切り替える方法
#29_FakePathを設定ファイルとSharedに移す
#30_Fakeデータのバリエーション
#31_Shareクラスの活用方法
#32_ベースフォームを作る
#33_SharedにログインIDを記憶する
#34_BaseFormでログインユーザーを表示する
#35_ValueObject
#36_ValueObjectを作成する
#37_抽象クラスValueObjectを使用してイコールの問題の解消
#38_AreaIdにビジネスロジックを入れる
#39_AreaIdクラスをEntityに乗せる
#40_MeasureDateの作成
#41_MeasureValueの作成
#42_オブジェクト指向の自動化
#43_Repositoryの具象クラス
#44_例外処理
#45_例外の作成
#46_インナーエクセプション
#47_例外の欠点
#48_メッセージの区分
#49_エラー処理の共通化
#50_ログの出力
#51_タイマー処理はどこに置く?
#52_タイマークラスの作成
#53_StaticValues
#54_Logics
#55_Helpers
#56_Module
#57_トランザクションはどこでかける?
#58_特徴を見極める
#59_さいごに