ASP.NETコアを使用したクリーンアーキテクチャの出発点。 Clean Architectureは、同じゆるく結合された、依存関係に反転したアーキテクチャの一連の名前の最新のものです。また、六角形、ポートアンドアダプター、またはオニオンアーキテクチャと名付けられています。
Clean Architectureの詳細と、NimbleProsのこのテンプレートの紹介Clean Architectureコースをご覧ください。コードアルダリスを使用して20%を節約します。
このアーキテクチャは、Steve SmithとJulie LermanによるDDD基礎コースで使用されています。
?チームのクリーンなアーキテクチャまたはDDDトレーニングおよび/または実装支援については、Steveの会社であるNimbleProsにお問い合わせください。
NimbleProsのトレーナーSarah "Sadukie" DutkiewiczとSteve "Ardalis" Smithからクリーンアーキテクチャを実装する方法について学びます。
このプロジェクトが好きまたは使用してソリューションを学習または起動している場合は、スターを渡してください。ありがとう!
または、本当に寛大だと感じている場合は、GitHubのスポンサーシップをサポートしています。上のボタンを参照してください。
Amazon AWSのFoss Fundがこのプロジェクトに12か月のスポンサーシップを授与することを選択したことを発表してください。ありがとう、そして私の他のすべての過去と現在のスポンサーに感謝します!
デフォルトでは、サイトはHTTPSを使用しており、LocalHost使用のための自己署名開発者証明書を持っていることを期待しています。 Chromeでエラーが発生した場合は、緩和指示についてこの回答をご覧ください。
メインブランチは現在.NET 9を使用しています。これは、Nugetパッケージバージョン10.xに対応しています。以前のバージョンが利用可能です - リリースを参照してください。
このテンプレートを使用するには、いくつかのオプションがあります。
dotnet new (推奨)を使用してインストールするまず、Nuget(https://www.nuget.org/packages/ardalis.cleaNarchitecture.template/)からテンプレートをインストールします。
dotnet new install Ardalis.CleanArchitecture.Template -?オプション:
dotnet new clean - arch - ?
ASP.NET Clean Architecture Solution (C # )
Author: Steve Smith @ardalis , Erik Dahl
Usage:
dotnet new clean - arch [ options ] [ template options ]
Options:
- n , -- name < name > The name for the output being created. If no name is specified , the name of the output
directory is used.
- o , -- output < output > Location to place the generated output.
-- dry - run Displays a summary of what would happen if the given command line were run if it would result
in a template creation.
-- force Forces content to be generated even if it would change existing files.
-- no - update-check Disables checking for the template package updates when instantiating a template.
-- project < project > The project that should be used for context evaluation.
- lang , -- language < C # > Specifies the template language to instantiate.
-- type < project > Specifies the template type to instantiate.
Template options:
-as , -- aspire Include .NET Aspire.
Type: bool
Default : falseこのインストールが正常にインストールされた後、 dotnet new listのテンプレートのリストにテンプレートを表示する必要があります。 「Clean-Arch」という短い名前の「ASP.NET Clean Architecture Solution」を探してください。
ソリューションのフォルダーを作成したい親ディレクトリに移動します。
このコマンドを実行して、サブフォルダー名でソリューション構造を作成しますYour.ProjectName :
dotnet new clean-arch -o Your.ProjectName
Your.ProjectNameディレクトリとソリューションファイルが作成され、その内部はすべての新しいソリューションコンテンツ、適切に名前が付けられ、実行/テストの準備ができています!
例: 
@dahlsailrunnerに感謝します。
既知の問題:
バージョン9の時点で、このソリューションテンプレートには、FastendPointsライブラリを使用したAPIエンドポイントのサポートのみが含まれています。私のApiendPointsライブラリ、カミソリページ、および/またはコントローラーを使用する場合は、それらを含む最後のテンプレートを使用できます。バージョン7.1。あるいは、インストール後にこのテンプレートに簡単に追加されます。
ファーストエンドポイントの代わりに(またはそれに加えて)ardalis.apiendpointsを使用するには、参照を追加して、ドキュメントからベースクラスを使用します。
dotnet add package Ardalis.ApiEndpointsプログラムにコントローラーのサポートを追加する必要があります。あなたが必要です:
builder . Services . AddControllers ( ) ; // ControllersWithView if you need Views
// and
app . MapControllers ( ) ;これらが整ったら、コントローラーフォルダーと(オプションで)ビューフォルダーを作成できるはずです。すべてが予想どおりに機能するはずです。個人的には、カミソリのページがコントローラーやビューよりもはるかに優れていると思うので、カミソリのページを完全に調査していない場合は、ビューを選択する前に、今すぐにやりたいと思うかもしれません。
プログラムファイルにRazorページのサポートを追加する必要があります。あなたが必要です:
builder . Services . AddRazorPages ( ) ;
// and
app . MapRazorPages ( ) ;次に、プロジェクトのルートにページフォルダーを追加して、そこから移動します。
このリポジトリに基づいて開始するには、ローカルでコピーを取得する必要があります。フォーク、クローン、またはダウンロードの3つのオプションがあります。ほとんどの場合、あなたはおそらくダウンロードしたいだけでしょう。
リポジトリをダウンロードし、zipファイルのブロックを解除し、プロジェクトで再生したい場合、またはアプリケーションの開始点として使用する場合は、新しいフォルダーに抽出する必要があります。
プルリクエストの送信を計画している場合にのみ、このリポジトリをフォークする必要があります。または、自分のGitHubアカウントにリポジトリのスナップショットのコピーを保管したい場合。
あなたが貢献者の1人であり、あなたがそれにアクセスすることをコミットしている場合、あなたはこのリポジトリをクローンする必要があります。それ以外の場合は、おそらく他のオプションの1つが必要です。
このテンプレートを使用するためにこれを行う必要はありませんが、インフラストラクチャプロジェクトで移行を適切にセットアップする場合は、移行コマンドを実行するときにそのプロジェクト名を指定する必要があります。
Visual Studioでパッケージマネージャーコンソールを開き、 Add-Migration InitialMigrationName -StartupProject Your.ProjectName.Web -Context AppDbContext -Project Your.ProjectName.Infrastructure実行します。
CLIの端末では、コマンドは似ています。 Webプロジェクトディレクトリからこれを実行します。
dotnet ef migrations add MIGRATIONNAME - c AppDbContext - p .. / Your.ProjectName.Infrastructure / Your.ProjectName.Infrastructure.csproj - s Your.ProjectName.Web.csproj - o Data / Migrations sqlserverを使用するには、 options.UseSqlite(connectionString)); options.UseSqlServer(connectionString)); Your.ProjectName.Infrastructure.StartupSetupファイル。また、 SqliteConnection 、データベースサーバーを指すYour.ProjectName.Web.ProgramファイルのDefaultConnectionに置き換えることを忘れないでください。
データベースを更新するには、このコマンドをWebプロジェクトフォルダーから使用します( Clean.Architectureをプロジェクトの名前に置き換えます):
dotnet ef database update - c AppDbContext - p .. / Clean .Architecture.Infrastructure / Clean .Architecture.Infrastructure.csproj - s Clean .Architecture.Web.csprojこのリポジトリの目標は、.NET Coreを使用して、ドメイン駆動型の設計(DDD)ベースのまたは単に透明なソリッドアプリケーションを構築するために使用できる基本的なソリューション構造を提供することです。これらのトピックの詳細については、こちらをご覧ください。
単一のプロジェクトとして、または従来のUI->ビジネスレイヤー - >データアクセスレイヤー「n -ティア」アーキテクチャに従うプロジェクトのセットとしてアプリケーションを構築することに慣れている場合は、これら2つのコース(理想的にはDDDファンダメンタルズより前)をチェックすることをお勧めします。
Steve Smithは、Microsoftの参照アプリケーションであるEshoponWebとそれに関連する無料の電子ブックも維持しています。ここでそれらをチェックしてください:
このプロジェクトとリポジトリの目標は、サンプルまたは参照アプリケーションを提供しないことに注意してください。それはただテンプレートになることを意図していますが、実際のソリューションをセットアップするときに物事がどこに属しているかを示すのに十分な部分があります。役に立たない「class1.cs」の代わりに、いくつかの実際のクラスがあります。彼らがそこにいる理由と、あなた自身の類似ファイルをどこに置くべきかを理解したらすぐにそれらを削除します。 /sampleフォルダーには、それを探している場合は、サンプルアプリケーションがあります。
このスターターキットを使用して、ドメイン駆動型のデザインコンセプトとパターンを使用してASP.NETコアの基本を教えています(ASP.NETコアがまだリリース前になっていたとき)。通常、私は、逸脱などのイベントや、最新の開発技術とテクニックに合わせてチームを高速化しようとしている企業向けのプライベートオンサイトワークショップに先立ち、1日または2日間の実践的なワークショップを教えています。今後のワークショップに関する情報をご希望の場合は、お気軽にご連絡ください。
このソリューションテンプレートの目標は、新しいプロジェクトにかなり裸のボーンスターターキットを提供することです。特定のエンタープライズアプリケーションが恩恵を受ける可能性のあるすべての可能なフレームワーク、ツール、または機能を含めるわけではありません。データアクセスなどのテクノロジーの選択は、Microsoftのテクノロジースタックを使用して、ほとんどのビジネスソフトウェア開発者にとって最も一般的でアクセス可能なテクノロジーに根ざしています。ロギング、監視、分析などに対する(現在)広範なサポートは含まれていませんが、これらはすべて簡単に追加できます。以下は、それに含まれるテクノロジー依存関係のリストと、それらが選ばれた理由です。このアーキテクチャの性質はモジュール性とカプセル化をサポートすることであるため、これらのほとんどは選択の技術のために簡単に交換できます。
ユーザー入力の検証は、すべてのソフトウェアアプリケーションの要件です。問題は、簡潔でエレガントな方法でそれを実装することはどこで理にかなっているのでしょうか?このソリューションテンプレートには、4つの個別のプロジェクトが含まれています。それぞれが検証の実行とビジネス不変性の実施を担当する可能性があります(検証が既に発生する必要がある場合、通常は例外としてモデル化されます)。
ドメインモデル自体は、通常、オブジェクト指向の設計に依存して、常に一貫した状態にあることを確認する必要があります。カプセル化を活用して、公共の状態変異アクセスを制限してこれを達成し、それに渡された引数はすでに検証されているため、ほとんどの場合、nullまたはその他の不適切な値は検証結果ではなく例外をもたらします。
ユースケース /アプリケーションプロジェクトには、システムがサポートするすべてのコマンドとクエリのセットが含まれています。独自のコマンドとクエリオブジェクトを検証することが頻繁に責任があります。これは、Mediatrの行動または他のパイプラインを介して一連の責任パターンを使用して最も簡単に行われます。
Webプロジェクトには、すべてのAPIエンドポイントが含まれています。これには、REPパターンに従って、独自のリクエストと応答の種類が含まれます。 FastEndPointsライブラリには、リクエストタイプのFluentValidationを使用した検証のための組み込みサポートが含まれています。これは、入力検証を実行するのにも自然な場所です。
APIのエンドポイント内で検証が発生し、その後、ユースケースレベルで再度発生することが冗長であると見なされる場合があります。 2つの場所で本質的に同じ検証を追加するトレードオフがあります。1つはAPIリクエスト用、もう1つはユースケースハンドラーに送信されたメッセージの場合です。防御的なコーディングに続いて、オーバーヘッドは最小限であり、心の安らぎとアプリケーションの堅牢性の向上は価値があるため、両方の場所に検証を追加することがしばしば理にかなっています。
コアプロジェクトは、クリーンアーキテクチャデザインの中心であり、他のすべてのプロジェクト依存関係はそれを指しているはずです。そのため、外部依存関係はほとんどありません。コアプロジェクトには、次のようなものを含むドメインモデルを含める必要があります。
これらのパターンの詳細とここで適用する方法をご覧ください。
オプションのプロジェクトです。多くの人がそれを要求していて、後で追加するよりも削除する方が簡単だったので、私はそれを含めました。これは、多くの場合、アプリケーションまたはアプリケーションサービスレイヤーとも呼ばれます。ユースケースプロジェクトは、CQRをコマンドとクエリに編成します( CommandsとQueries用のフォルダーを持っていることを検討しましたが、実際のコマンドまたはクエリごとのフォルダーは、余分なネストなしで十分であると感じました)。コマンドはドメインモデルを変異させるため、常にデータアクセスにリポジトリの抽象化を使用する必要があります(リポジトリは、ドメインモデルタイプを取得し、持続する方法です)。クエリは読み取られるため、リポジトリパターンを使用する必要はありませんが、代わりに、最も便利なクエリサービスまたはアプローチを使用できます。
ユースケースプロジェクトはコアに依存するように設定されており、インフラストラクチャに依存していないため、データアクセスのために抽象化を定義する必要があります。また、仕様のようなものを使用できます。これは、クエリロジックと結果タイプマッピングをカプセル化するのに役立つ場合があります。ただし、リポジトリ/仕様を使用する必要はありません。データを取得するための最も効率的な方法である場合、SQLクエリを発行するか、ストアドプロシージャを呼び出すだけです。
これは(それなしでは、APIのエンドポイントがドメインモデルまたはクエリサービスと直接動作するだけです)を含めるオプションのプロジェクトですが、自動テストを追加するための素晴らしいU-Inorantの場所を提供し、メッセージハンドラーの周りに責任パターンを使用して懸念を交わすためのポリシーを適用することに役立ちます(検証、Caching、Loging、Loging、Thimingなど、テンプレートには、ロギング用の例が含まれています。これは、SharedKernel Nugetパッケージにあります。
アプリケーションの外部リソースへの依存関係のほとんどは、インフラストラクチャプロジェクトで定義されているクラスに実装する必要があります。これらのクラスは、コアで定義されたインターフェイスを実装する必要があります。多くの依存関係を備えた非常に大きなプロジェクトがある場合、複数のインフラストラクチャプロジェクト(infrastructure.dataなど)があることは理にかなっていますが、ほとんどのプロジェクトでは、フォルダーを備えた1つのインフラストラクチャプロジェクトが正常に機能します。テンプレートにはデータアクセスとドメインのイベントの実装が含まれていますが、電子メールプロバイダー、ファイルアクセス、Web APIクライアントなどをこのプロジェクトに追加して、コアプロジェクトやUIプロジェクトに結合を追加していません。
アプリケーションのエントリポイントは、ASP.NETコアWebプロジェクト(または、WebプロジェクトをロードするAspireHostプロジェクト)です。これは実際にはコンソールアプリケーションであり、 Program.csにはpublic static void Mainメソッドがあります。 APIエンドポイントを整理するために、ファーストエンドポイントとREPRパターンを活用します。
共有カーネルは、境界のあるコンテキスト間で共通の要素を共有するために使用されます。これはDDD用語ですが、多くの組織は、いくつかのアプリケーション間で共有するのに役立つものについて「共通」プロジェクトまたはパッケージを活用しています。
複数の境界コンテキスト間でコードを共有する必要がある場合は、個別のSharedkernelプロジェクトとソリューションを作成することをお勧めします(DDD Fundamentalsを参照)。さらに、これをNugetパッケージ(おそらくあなたの組織内で個人的に)として公開し、それを必要とするプロジェクトによってNuget依存関係として参照されることをお勧めします。
以前は、SharedKernelのプロジェクトがこのプロジェクトに含まれていました。ただし、上記の理由から、別のパッケージであるardalis.sharedkernelになりました。
SharedKernelパッケージの別の例を表示したい場合は、更新されたPluralSight DDDコースで使用しているものはNugetにあります。
テストプロジェクトは、テストの種類(ユニット、機能、統合、パフォーマンスなど)に基づいて編成できます。または、テストしているプロジェクト(コア、インフラストラクチャ、Web)、またはその両方によって編成できます。このシンプルなスターターキットでは、テストプロジェクトは、このソリューションに存在するユニット、機能、統合テストプロジェクトを備えたテストの種類に基づいて編成されます。機能テストは、実際のWebサイトを実際にホストしたり、ネットワークを越えたりすることなく、WebプロジェクトのAPIの皮下テストを実行する特別な種類の統合テストです。これらの種類のテストをより短く、維持しやすくするために、多数のテストヘルパーを作成しました。
このソリューションテンプレートには、いくつかの一般的なパターン、特にドメイン駆動型のデザインパターンをサポートするためのコードが組み込まれています。これらのいくつかがどのように機能するかについての簡単な概要を次に示します。
ドメインイベントは、実装からの操作のトリガーを切り離すための優れたパターンです。これは、イベントのハンドラーには依存関係がありますが、通常はそうではないため、ドメインエンティティ内から特に便利です。サンプルでは、 ToDoItem.MarkComplete()メソッドを使用してこれを実行できます。次のシーケンス図は、アイテムがWeb APIエンドポイントを介して完全にマークされたときのイベントとそのハンドラーの使用方法を示しています。
