NDDD

ドメイン駆動開発_フォルダー構成編_#12_ Repositoriesフォルダーの作成

前回はテストコードを記述しました。そのため現在はテストがレッドバー(NG)になっている状態です。原因はSearchメソッドが未実装だからですね。今回はテストを通すために,本番コードの実装を進めていきましょう。

インタフェースの必要性

テストコードの中には,現在次のような記述がありますね。

vm.AreaIdText.Is(“0001”);

vm.MeasureDateText.Is(“2012/12/12 12:34:56”);

vm.MeasureValueText.Is(“12.34℃”);

これらの値や日付は,実際にはSqlServerなどのデータベースから値を取得する想定ですが,テストコードでの検証時にはデータベースを使用しません。実際のデータベースに接続してしまうと,テストごとに各テーブルの状態を再作成しないといけませんし,それらの環境が整っているPCでないとテストが成功しないことになってしまいます。そうならないようし,Moqというツールを使って,テストデータはインタフェース越しに,取得する方法を解説します。

Repositoriesの作成

インタフェースが必要といいましたが,データベースのような外部から値を取得する際は,必ずインタフェースを使います。そして外部から値を運んでくる場合はRepositoriesというフォルダーにインタフェースを入れます。今回はMeasureという計測値の入っているテーブルから値を取得する想定なので,「IMeasureRepository」という名前で作成します。

まず,ドメインプロジェクトに「Repositories」フォルダーを作成しましょう。
ドメインプロジェクトのデフォルトで作成される「Class1」クラスは不要なので削除します。

ドメインプロジェクトを右クリックして「追加」「新しいフォルダー」を選択し,新規フォルダーを追加し,名前を「Repositories」に変更します。

フォルダーができたら,インタフェースを「IMeasureRepository」という名前で追加します。次のようなフォルダー階層になります。

IMeasureRepositoryの実装

IMeasureRepositoryには次のようにコーディングします。
GetLatestというMeasureテーブルから直近値を返す想定のメソッドです。戻り値は,MeasureEntityです。Entityはデータベースの1行分のデータと思ってもらってOKです。データベースから取得した値を入れるクラスと思っておいてください。

MeasureEntityはまだ作成していないので,コンパイルエラーとなります。次回よりEntityの作成を行います。

NDDD

C#プログラマーのための正しい3層構造が分かる「C#アーキテクチャー解説動画」をここで公開しています。よかったら見てみてください。

#01_プロジェクトの作成
#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_さいごに

 

参考図書

ドメイン駆動開発

エリック・エヴァンスのドメイン駆動設計

実践ドメイン駆動設計

ドメイン駆動

現場で役立つシステム設計の原則

エンタープライズアプリケーションアーキテクチャパターン

デザインパターン

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向のこころ

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

オブジェクト指向

ジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
  すばらしい本です。オブジェクト指向が詰まっています。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
  サンプルコードはjavaですが,最初にオブジェクト指向に目覚めるのに最適な本です。

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
  マンガみたいな感じで読めて,オブジェクト指向について学べます。  

Clean Code アジャイルソフトウェア達人の技

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Adaptive Code ~ C#実践開発手法

.NETのエンタープライズアプリケーションアーキテクチャ

実装パターン
  廃盤のため異常に高くなりすぎなので,様子を見た方がいい気がします。一万円のボリュームがあるかどうかは微妙です。

オブジェクト指向でなぜつくるのか

レガシーコード改善ガイド

リファクタリング 既存のコードを安全に改善する

C#でオブジェクト指向をする方法

オブジェクト指向の原則1:単一責務の原則