依存関係図を使用したコードの検証

依存関係図を使用する理由

コードが設計と競合しないことを確認するには、Visual Studio で依存関係図を使用してコードを検証します。 これが次の点で役立つ場合があります。

  • 依存関係図のコードと依存関係で依存関係間の競合を見つける。

  • 提案された変更によって影響を受ける可能性がある依存関係を見つける。

    たとえば、依存関係図を編集して予測されるアーキテクチャの変更を表示した後、コードを検証して、影響を受ける依存関係を確認できます。

  • コードを別の設計にリファクターまたは移行する。

    コードを別のアーキテクチャに移動したときに作業が必要なコード、または依存関係を見つけます。

必要条件

  • Visual Studio

    .NET Core プロジェクトの依存関係図を作成するには、Visual Studio 2019 バージョン 16.2 以降が必要です。

  • 依存関係図を使用するモデリング プロジェクトが含まれたソリューション。 この依存関係図は、検証する対象の C# プロジェクトまたは Visual Basic プロジェクトの成果物にリンクしている必要があります。 「コードからの依存関係図の作成」を参照してください。

この機能をサポートする Visual Studio のバージョンを確認するには、「アーキテクチャとモデリング ツールのエディション サポート」を参照してください。

Visual Studio で開いている依存関係図から、またはコマンド プロンプトから、コードを手動で検証できます。 ローカル ビルドまたは Azure Pipelines ビルドの実行時に、コードを自動的に検証することもできます。

重要

Team Foundation Server (TFS) を使用してレイヤー検証を実行する場合は、ビルド サーバーに同じバージョンの Visual Studio をインストールすることも必要です。

ライブ依存関係検証

依存関係検証はリアルタイムで行われ、エラーは直ちに [エラー一覧] に表示されます。

  • ライブ検証は、C# および Visual Basic でサポートされています。

  • ライブ依存関係検証を使用するときに完全なソリューション分析を有効にするには、[エラー一覧] に表示される金色のバーからオプションの設定を開きます。

    • ソリューションのすべてのアーキテクチャの問題を確認する必要がない場合は、金色のバーを完全に閉じることができます。
    • 完全なソリューション分析を有効にしない場合は、編集中のファイルに対してのみ分析が実行されます。
  • プロジェクトをアップグレードしてライブ検証を有効にすると、ダイアログに変換の進行状況が表示されます。

  • ライブ依存関係検証のためにプロジェクトを更新する場合、NuGet パッケージのバージョンはすべてのプロジェクトで同じバージョンにアップグレードされ、使用されている最も高いバージョンになります。

  • 新しい依存関係検証プロジェクトを追加すると、プロジェクトの更新がトリガーされます。

項目で検証がサポートされているかどうかを確認する

複数のアプリ間で共有される Web サイト、Office ドキュメント、プレーン テキスト ファイル、プロジェクトのファイルにレイヤーをリンクできますが、そのレイヤーは検証プロセスには含まれません。 個々のレイヤー間に依存関係が表示されない場合、これらのレイヤーにリンクされているプロジェクトやアセンブリへの参照については、検証エラーは表示されません。 このような参照は、コードがこれらの参照を使用している場合を除き、依存関係と見なされません。

  1. 依存関係図で 1 つ以上のレイヤーを選択し、選択したレイヤーを右クリックし、[リンクの表示] をクリックします。

  2. レイヤー エクスプローラーで、[検証をサポート] 列を確認します。 値が false の場合、この項目では検証がサポートされません。

検証用に他の .NET アセンブリおよびプロジェクトを含める

項目を依存関係図にドラッグすると、対応する .NET アセンブリまたはプロジェクトへの参照が、モデリング プロジェクト内の [レイヤー参照] フォルダーに自動的に追加されます。 このフォルダーには、検証時に分析されたアセンブリおよびプロジェクトへの参照が格納されます。 また、その他の検証対象の .NET アセンブリおよびプロジェクトを、手動で依存関係図にドラッグせずに含めることもできます。

  1. ソリューション エクスプローラーで、モデリング プロジェクトまたは [レイヤー参照] フォルダーを右クリックします。次に、[参照の追加] をクリックします。

  2. [参照の追加] ダイアログ ボックスで、アセンブリまたはプロジェクトを選択し、[OK] をクリックします。

コードを手動で検証する

ソリューション項目にリンクされた、開かれている依存関係図がある場合は、その図から [検証] のショートカット コマンドを実行できます。 コマンド プロンプトを使用して、/p:ValidateArchitecture カスタム プロパティを True に設定して msbuild コマンドを実行することもできます。 たとえば、コードの変更を行う場合、依存関係の競合を早期にキャッチできるようにレイヤー検証を定期的に実行します。

開いている依存関係図からコードを検証する

  1. 図の画面を右クリックし、[アーキテクチャの検証] をクリックします。

    Note

    既定では、依存関係図 (.layerdiagram) ファイルの [ビルド アクション] プロパティが [検証] に設定されており、図は検証プロセスに含まれます。

    発生したエラーは、[エラー一覧] ウィンドウに表示されます。 検証エラーの詳細については、「レイヤー検証に関する問題のトラブルシューティング」を参照してください。

  2. 各エラーのソースを表示するには、[エラー一覧] ウィンドウでエラーをダブルクリックします。

    Note

    Visual Studio では、エラーのソースの代わりにコード マップが表示されることがあります。 これは、依存関係図で指定されていないアセンブリ上にコードの依存関係があるか、依存関係図で指定された依存関係がコードにない場合に起こります。 コード マップまたはコードをレビューし、依存関係が必要であるかどうかを検証してください。 コード マップの詳細については、ソリューション間の依存関係のマップに関するページを参照してください。

  3. エラーを管理するには、「レイヤー検証エラーを解決する」を参照してください。

コマンド プロンプトでコードを検証する

  1. Visual Studio コマンド プロンプトを開きます。

  2. 次のいずれかを選択します。

    • ソリューションの特定のモデリング プロジェクトに対してコードを検証するには、次のカスタム プロパティを使用して MSBuild を実行します。

      msbuild <FilePath+ModelProjectFileName>.modelproj /p:ValidateArchitecture=true
      
      • または -

        モデリング プロジェクト (.modelproj) ファイルと依存関係図が入っているフォルダーを参照し、次のカスタム プロパティを使用して MSBuild を実行します。

        msbuild /p:ValidateArchitecture=true
        
    • ソリューションのすべてのモデリング プロジェクトに対してコードを検証するには、次のカスタム プロパティを使用して MSBuild を実行します。

      msbuild <FilePath+SolutionName>.sln /p:ValidateArchitecture=true
      
      • または -

        依存関係図が入っているモデリング プロジェクトを必ず含むソリューション フォルダーを参照し、次のカスタム プロパティを使用して MSBuild を実行します。

        msbuild /p:ValidateArchitecture=true
        

      発生したすべてのエラーが表示されます。 MSBuild の詳細については、「MSBuild」および「MSBuild タスク」を参照してください。

    検証エラーの詳細については、「レイヤー検証に関する問題のトラブルシューティング」を参照してください。

検証エラーを管理する

開発プロセスの実行中は、検証時に報告される一部の競合を抑制できます。 たとえば、既に解決したエラーや特定のシナリオに関連しないエラーを抑制できます。 エラーを抑制した場合は、Team Foundation で作業項目をログに記録することをお勧めします。

警告

作業項目を作成またはそれにリンクするには、既に TFS ソース コード管理 (SCC) に接続されている必要があります。 別の TFS SCC への接続を開こうとすると、Visual Studio が現在のソリューションを自動的に閉じます。 作業項目を作成またはそれにリンクしようとする前に、適切な SCC に接続されていることを確認してください。 Visual Studio の今後のリリースでは、SCC に接続されていないとメニュー コマンドを使用できません。

検証エラーの作業項目を作成する

  • [エラー一覧] ウィンドウで、エラーを右クリックし、[作業項目の作成] をポイントし、作成する作業項目の種類をクリックします。

[エラー一覧] ウィンドウで検証エラーを管理するには、次の操作を行います。

目的 こちらの手順に従ってください
検証中に選択したエラーを抑制する エラーを 1 つ以上選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制] をクリックします。

抑制されたエラーは、取り消し線付きで表示されます。 次回検証を実行したとき、これらのエラーは表示されません。

抑制されたエラーは、対応する依存関係図ファイルの .suppressions ファイルで追跡されます。
選択したエラーの抑制を停止する 抑制されたエラーを 1 つまたは複数選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制の停止] をクリックします。

次回検証を実行したとき、抑制されたエラーのうち選択したものが表示されます。
[エラー一覧] ウィンドウに、抑制されたすべてのエラーを再び表示する [エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの表示] をクリックします。
[エラー一覧] ウィンドウで抑制されたエラーをすべて非表示にする [エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの非表示] をクリックします。

コードを自動的に検証する

ローカル ビルドを実行するたびにレイヤー検証を実行できます。 チームで Azure DevOps を使用する場合、ゲート チェックインを使用してレイヤー検証を実行できます。これは、カスタム MSBuild タスクを作成することで指定できます。また、ビルド レポートを使用して検証エラーを収集することもできます。 ゲート チェックイン ビルドを作成するには、TFVC ゲート チェックインに関するページを参照してください。

ローカル ビルド時にコードを自動的に検証するには

テキスト エディターを使用してモデリング プロジェクト (.modelproj) ファイルを開き、次のプロパティを追加します。

<ValidateArchitecture>true</ValidateArchitecture>

- または -

  1. ソリューション エクスプローラーで、1 つ以上の依存関係図が含まれているモデリング プロジェクトを右クリックし、[プロパティ] をクリックします。

  2. [プロパティ] ウィンドウで、モデリング プロジェクトの [アーキテクチャの検証] プロパティが [True] に設定されていることを確認します。

    これには、検証プロセス内のモデリング プロジェクトが含まれます。

  3. ソリューション エクスプローラーで、検証に使用する依存関係図 (.layerdiagram) ファイルをクリックします。

  4. [プロパティ] ウィンドウで、図の [ビルド アクション] プロパティが [検証] に設定されていることを確認します。

    これには、検証プロセス内の依存関係図が含まれます。

[エラー一覧] ウィンドウでエラーを管理する方法については、「レイヤー検証エラーを解決する」を参照してください。

レイヤー検証に関する問題のトラブルシューティング

レイヤー検証に関する問題とその解決方法について、次の表で説明します。 これらの問題は、コードと設計の間の競合によって発生するエラーとは異なります。 これらのエラーの詳細については、「レイヤー検証に関する問題のトラブルシューティング」を参照してください。

問題点 考えられる原因 解像度
検証エラーが予期したとおりに発生しない。 検証はソリューション エクスプローラーの他の依存関係図からコピーされた依存関係図および同じモデリング プロジェクトの依存関係図には機能しません。 この方法でコピーされた依存関係図には、コピー元の依存関係図と同じ参照が含まれます。 新しい依存関係図をモデリング プロジェクトに追加します。

元の依存関係図から新しい図へ要素をコピーします。

レイヤー検証エラーを解決する

依存関係図と照らし合わせてコードを検証すると、コードが設計と競合している場合に検証エラーが発生します。 たとえば、次の条件のとき、検証エラーが発生する場合があります。

  • 成果物が不適切なレイヤーに割り当てられている。 この場合、成果物を移動します。

  • クラスなどの成果物が、アーキテクチャに違反する形で別のクラスを使用している。 この場合、コードをリファクタリングして依存関係を削除します。

これらのエラーを解決するには、コードを更新して、検証時にエラーが表示されなくなるようにします。 この作業は、反復的な方法で実行します。

次のセクションでは、これらのエラーで使用される構文を示し、これらのエラーの意味を説明し、エラーを解決または管理するために実行できることを提示します。

構文 説明
ArtifactN(ArtifactTypeN) ArtifactN は、依存関係図にあるレイヤーに関連付けられている成果物です。

ArtifactTypeNArtifactN の型で、クラスメソッドなどがあります。たとえば、次のようになります。

MySolution.MyProject.MyClass.MyMethod(Method)
NamespaceNameN 名前空間の名前。
LayerNameN 依存関係図のレイヤーの名前。
DependencyType Artifact1 および Artifact2 との間の依存関係の型です。 たとえば、Artifact1Artifact2呼び出し関係にあるなどです。
エラー構文 エラーの説明
DV0001: 無効な依存関係 この問題は、レイヤーにマップされているコード要素 (名前空間、型、メンバー) が、別のレイヤーにマップされているコード要素を参照しているにもかかわらず、このレイヤーを含む依存関係検証ダイアグラムのこれらのレイヤーの間に依存関係の矢印がない場合に報告されます。 これは依存関係制約違反です。
DV1001: 名前空間名が無効です この問題は、[許可されている名前空間名] プロパティにこのコード要素が定義されている名前空間が含まれていないレイヤーに関連付けられたコード要素で報告されます。 これは名前付けの制約違反です。 [許可されている名前空間名] の構文は、名前空間のセミコロンで区切った一覧であることに注意してください。これによって、レイヤーに関連付けられたコード要素を定義することが許可されます。
DV1002: 参照できない名前空間への依存関係 この問題は、レイヤーに関連付けられ、そのレイヤーの [参照できない名前空間] プロパティで定義されている名前空間で定義された別のコード要素を参照しているコード要素に対して報告されます。 これは名前付けの制約違反です。 [参照できない名前空間] プロパティは、このレイヤーに関連付けられているコード要素内で参照できない名前空間のセミコロンで区切られた一覧として定義されていることに注意してください。
DV1003: 許可されていない名前空間名 この問題は、[許可されていない名前空間名] プロパティにこのコード要素が定義されている名前空間が含まれているレイヤーに関連付けられたコード要素で報告されます。 これは名前付けの制約違反です。 [許可されていない名前空間名] プロパティは、このレイヤーに関連付けられたコード要素を定義できない名前空間のセミコロンで区切られた一覧として定義されていることに注意してください。
DV2001: レイヤー図の存在 この問題は、依存関係図ファイルが含まれていないが、依存関係検証アナライザーを参照しているプロジェクトで報告されます。 依存関係検証が使用されていない場合は、ソリューション エクスプローラーから直接 "Microsoft.DependencyValidation.Analyzers" を削除するか、この警告を非表示にすることができます。 依存関係図を追加するには、「コードからの依存関係図の作成」を参照してください。
DV2002: マップされていない型のベース この問題は、コード要素がどのレイヤーにもマップされていない場合に報告されます。
DV3001: 不足しているリンク 'Artifact' へのレイヤー 'LayerName' リンクが見つかりません。 アセンブリ参照が存在することを確認してください。
DV9001: アーキテクチャの検証で内部エラーが検出されました 結果が不完全である可能性があります。 詳細については、ビルド イベント ログの詳細または出力ウィンドウを参照してください。