ドメイン駆動開発_フォルダー構成編_#06_Infrastructureのフォルダー構成

当サイトではアフィリエイト広告を利用しています。

NDDD

前回はドメインプロジェクトのフォルダー構成のお話をしました。
今回はInfrastructure(インフラストラクチャー)プロジェクトのフォルダー構成を解説していきます。

Infrastructureとは?

インフラストラクチャーとは,作成するアプリケーションが,外部と接触している部分のコードのみを集める場所です。外部と接触している部分というのは,例えばテキストファイルを開いたり,CSVファイルを開いたり,データベースへアクセスすることです。

C#で作成したアプリケーションは最終的には「XX.exe」みたいな感じで実行ファイルになって実行されますが,多くの場合,外部と接触をします。「電卓アプリ」とかであれば,起動して,何かファイルを読み込んだり,書き込んだりという処理をしないかもしれませんが,もしも,アプリ終了後に「最後の値を記憶する」という仕様があるのであれば,それは何かしらの外部に記憶させる必要があります。そういったときに,多くの場合で「データベース」や「ファイル」が使われます。

それ以外にも,パソコンからパソコンに通信したり,何らかの機器と通信したりするような場合も,当然外部との接触という事になります。

なぜ外部との接触部分を集めるのか?

なぜ外部との接触部分を集める必要があるのか?というと,それには2つの理由があります。

外部の影響を局所的にする

外部と接触しているという事は,外部の影響を受けます。起動後どことも接触しない「電卓アプリ」であれば,好きに作成しても外部の影響は受けませんが,例えばSqlServerを使用している場合,SqlServerがバージョンアップすると,正しく動作しなくなる可能性があります。何かしらの修正が発生した場合,外部接触部分を局所化しておくと,修正が容易になります。ソリューションの至る所でSqlServerに接触していたら,コードの隅々までチェックしないと,対処できなくなります。なので,SqlServerに触れるところは極限まで限定的に接触させます。

テスト容易性

外部と接触している部分は「テストがやり辛い」という特性があります。例えば計測器と通信するパソコンソフトを作成する場合は,その「計測器がないとテストできない」という状況になります。その場合でも,容易にダミーデータを流し込めるような状況にすることで,テスト容易性が上がります。そのためにも外部接触部分を切り離して考えておく必要があります。

フォルダー構成

フォルダー構成としては,テクノロジーごとにフォルダーを分けるようにします。SqlServerを使用する場合は「SqlServer」で1つフォルダーを作成します。CSVを使用するなら「Csv」というフォルダーを作成し,外部と接触する部分のみ実装します。要するに,外部との通信ができない場合は,通信エラーになってしまうコードのみを記述します。そしてそれらは,ドメイン層のRepositoriesフォルダーに作成するインタフェースを使用します。

Fake

偽物のデータの事をFakeと呼んでいます。ダミーデータと思ってください。インタフェース越しに外部と接触することで,外部と接触する実装と,接触しないFakeモードでの接触を実装することで,外部データとの通信部分を容易にテストすることができます。SqlServerを使用する場合も,とりあえずFake実装をすることで,プロトタイプにもなるし,テスト容易性も上がります。

Factoryパターン

本番コードとFakeコードの切り替えがFactoryパターンを使用します。Factoryパターンとは,クラスを生成することだけをするクラスです。ここで,FactoryのみPublicで公開し,その他のInfrastructureのコードをInternalにすることで,Factory経由でしかアクセスできないように強制することができ,すべてのクラスが本番コード,もしくはFakeモードでの生成を強制できるようにして,一部だけFakeという誤った実行状態にならないようにすることができます。