レイヤー図を使用したコードの検証
コードが設計と競合しないことを確認するには、Visual Studio Ultimate および Visual Studio Premium でレイヤー図を使用してコードを検証します。 これが次の点で役立つ場合があります。
レイヤー図のコードと依存関係で依存関係間の競合を見つける。
提案された変更によって影響を受ける可能性がある依存関係を見つける。
たとえば、レイヤー図を編集して予測されるアーキテクチャの変更を表示した後、コードを検証して、影響を受ける依存関係を確認できます。
コードを別の設計にリファクターまたは移行する。
コードを別のアーキテクチャに移動したときに作業が必要なコード、または依存関係を見つけます。
Visual Studio で開いているレイヤー図から、またはコマンド プロンプトから、コードを手動で検証できます。 ローカル ビルドまたは Team Foundation ビルドの実行時に、コードを自動的に検証することもできます。 「チャネル 9 ビデオ: レイヤー図の使用によるアーキテクチャの設計と検証」を参照してください。
重要
Team Foundation ビルドを使用してレイヤー検証を実行する場合は、ビルド サーバーに Visual Studio Ultimate をインストールすることも必要です。
要件
Visual Studio Ultimate または Visual Studio Premium
Team Foundation ビルド サーバーにインストールされた Visual Studio Ultimate (Team Foundation ビルドを使用してコードを自動的に検証するために必要)
レイヤー図を使用するモデリング プロジェクトが含まれたソリューション。 このレイヤー図は、検証する対象の Visual C# プロジェクトまたは Visual Basic .NET プロジェクトの成果物にリンクしている必要があります。 「コードからのレイヤー図の作成」を参照してください。
項目で検証がサポートされているかどうかを確認する
検証用に他の .NET アセンブリおよびプロジェクトを含める
コードを手動で検証する
コードを自動的に検証する
レイヤー検証に関する問題のトラブルシューティング
レイヤー検証エラーを把握して解決する
項目で検証がサポートされているかどうかを確認する
複数のアプリ間で共有される Web サイト、Office ドキュメント、プレーン テキスト ファイル、プロジェクトのファイルにレイヤーをリンクできますが、そのレイヤーは検証プロセスは含まれません。 個々のレイヤー間に依存関係が表示されない場合、これらのレイヤーにリンクされているプロジェクトやアセンブリへの参照については、検証エラーは表示されません。 このような参照は、コードがこれらの参照を使用している場合を除き、依存関係と見なされません。
レイヤー図で 1 つ以上のレイヤーを選択し、選択したレイヤーを右クリックし、[リンクの表示] をクリックします。
レイヤー エクスプローラーで、[検証をサポート] 列を確認します。 値が false の場合、この項目では検証がサポートされません。
検証用に他の .NET アセンブリおよびプロジェクトを含める
項目をレイヤー図にドラッグすると、対応する .NET アセンブリまたはプロジェクトへの参照が、モデリング プロジェクト内のレイヤー参照フォルダーに自動的に追加されます。 このフォルダーには、検証時に分析されたアセンブリおよびプロジェクトへの参照が格納されます。 また、その他の検証対象の .NET アセンブリおよびプロジェクトを、手動でレイヤー図にドラッグせずに含めることもできます。
ソリューション エクスプローラーで、モデリング プロジェクトまたは [レイヤー参照] フォルダーを右クリックします。次に、[参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスで、アセンブリまたはプロジェクトを選択し、[OK] をクリックします。
コードを手動で検証する
ソリューション項目にリンクされた、開かれているレイヤー図がある場合は、その図から [検証] のショートカット コマンドを実行できます。 また、コマンド プロンプトを使用すると、Trueに設定した /p:ValidateArchitecture カスタム プロパティを指定して msbuild コマンドを実行することもできます。 たとえば、コードの変更を行う場合、依存関係の競合を早期にキャッチできるようにレイヤー検証を定期的に実行します。
開かれているレイヤー図からコードを検証するには
図の画面を右クリックし、[アーキテクチャの検証] をクリックします。
注意
既定では、図を検証プロセスに含めるには、レイヤー図 (layerdiagram) ファイルの "ビルド アクション" プロパティが [検証] に設定されている必要があります。
発生したエラーは、[エラー一覧] ウィンドウに表示されます。 検証エラーの詳細については、「レイヤー検証エラーを把握して解決する」を参照してください。
各エラーのソースを表示するには、[エラー一覧] ウィンドウでエラーをダブルクリックします。
注意
Visual Studio では、エラーのソースの代わりに依存関係グラフが表示されることがあります。これは、レイヤー図で指定されていないアセンブリ上にコードの依存関係があるか、レイヤー図で指定された依存関係がコードにない場合に起こります。依存関係グラフまたはコードを確認し、依存関係が必要であるかどうかを検証してください。依存関係グラフの詳細については、「依存関係グラフ上のコード間での依存関係の対応付け」を参照してください。
エラーを管理する方法については、「検証エラーを管理する」を参照してください。
コマンド プロンプトでコードを検証するには
Visual Studio のコマンド プロンプトを開きます。
次のいずれかを選択します。
ソリューションの特定のモデリング プロジェクトに対してコードを検証するには、次のカスタム プロパティを使用して 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 で作業項目をログに記録することをお勧めします。
検証エラーの作業項目を作成するには
- [エラー一覧] ウィンドウで、エラーを右クリックし、[作業項目の作成] をポイントし、作成する作業項目の種類をクリックします。
[エラー一覧] ウィンドウで検証エラーを管理するには、次の操作を行います。
目的 |
手順 |
---|---|
検証中に選択したエラーを抑制する |
エラーを 1 つ以上選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制] をクリックします。 抑制されたエラーは、取り消し線付きで表示されます。 次回検証を実行したとき、これらのエラーは表示されません。 抑制されたエラーは、対応するレイヤー図ファイルの .suppressions ファイルで追跡されます。 |
選択したエラーの抑制を停止する |
抑制されたエラーを 1 つまたは複数選択して右クリックし、[検証エラーの管理] をポイントし、[エラーの抑制の停止] をクリックします。 次回検証を実行したとき、抑制されたエラーのうち選択したものが表示されます。 |
[エラー一覧] ウィンドウに、抑制されたすべてのエラーを再び表示する |
[エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの表示] をクリックします。 |
[エラー一覧] ウィンドウで抑制されたエラーをすべて非表示にする |
[エラー一覧] ウィンドウ内の任意の場所を右クリックし、[検証エラーの管理] をポイントし、[抑制されたエラーの非表示] をクリックします。 |
コードを自動的に検証する
ローカル ビルドを実行するたびにレイヤー検証を実行できます。 チームで Team Foundation ビルドを使用する場合、カスタム MSBuild タスクを作成して指定できるゲート チェックインでレイヤー検証を行うことができ、ビルド レポートを使って検証エラーを収集できます。ゲート チェックイン ビルドを作成するには、「変更内容を検証するためのゲート チェックイン ビルド プロセスの定義」を参照してください。
ローカル ビルド時にコードを自動的に検証するには
- テキスト エディターを使用してモデリング プロジェクト (.modelproj) ファイルを開き、次のプロパティを追加します。
<ValidateArchitecture>true</ValidateArchitecture>
または
ソリューション エクスプローラーで、1 つ以上のレイヤー図が含まれているモデリング プロジェクトを右クリックし、[プロパティ] をクリックします。
プロパティ ウィンドウで、モデリング プロジェクトの "アーキテクチャの検証" プロパティが [True] に設定されていることを確認します。
これには、検証プロセス内のモデリング プロジェクトが含まれます。
ソリューション エクスプローラーで、検証プロセスに使用するレイヤー図 (.layerdiagram) ファイルをクリックします。
[プロパティ] ウィンドウで、図の "ビルド アクション" プロパティが [検証] に設定されていることを確認します。
これには、検証プロセス内のレイヤー図が含まれます。
[エラー一覧] ウィンドウで検証エラーを管理する方法については、「検証エラーを管理する」を参照してください。
Team Foundation ビルド時にコードを自動的に検証するには
チーム エクスプローラーで、ビルド定義をダブルクリックし、[プロセス] をクリックします。
[ビルド プロセス パラメーター] の [コンパイル] を展開し、[MSBuild 引数] パラメーターに次のように入力します。
/p:ValidateArchitecture=true
検証エラーの詳細については、「レイヤー検証エラーを把握して解決する」を参照してください。 Team Foundation ビルド の詳細については、以下のトピックを参照してください。
レイヤー検証に関する問題のトラブルシューティング
レイヤー検証に関する問題とその解決方法について、次の表で説明します。 これらの問題は、コードと設計の間の競合によって発生するエラーとは異なります。 これらの検証エラーの詳細については、「レイヤー検証エラーを把握して解決する」を参照してください。
懸案事項 |
原因 |
解決策 |
---|---|---|
検証エラーが予期したとおりに発生しない。 |
検証はソリューション エクスプローラーの他のレイヤー図からコピーされたレイヤー図および同じモデリング プロジェクトのレイヤー図には機能しません。 この方法でコピーされたレイヤー図には、コピー元のレイヤー図と同じ参照が含まれます。 |
|
レイヤー検証エラーを把握して解決する
レイヤー図と照らし合わせてコードを検証すると、コードが設計と競合している場合に検証エラーが発生します。 たとえば、次の条件のとき、検証エラーが発生する場合があります。
成果物が不適切なレイヤーに割り当てられている。 この場合、成果物を移動します。
クラスなどの成果物が、アーキテクチャに違反する形で別のクラスを使用している。 この場合、コードをリファクタリングして依存関係を削除します。
これらのエラーを解決するには、コードを更新して、検証時にエラーが表示されなくなるようにします。 この作業は、反復的な方法で実行します。
次のセクションでは、これらのエラーで使用される構文を示し、これらのエラーの意味を説明し、エラーを解決または管理するために実行できることを提示します。
構文 |
説明 |
---|---|
ArtifactN(ArtifactTypeN) |
ArtifactN は、レイヤー図にあるレイヤーに関連付けられている成果物です。 ArtifactTypeN は ArtifactN の型で、クラスやメソッドなどがあります。たとえば、次のようになります。 MySolution.MyProject.MyClass.MyMethod(Method) |
NamespaceNameN |
名前空間の名前。 |
LayerNameN |
レイヤー図のレイヤーの名前。 |
DependencyType |
Artifact1 および Artifact2 との間の依存関係の型です。 たとえば、Artifact1 は Artifact2 と呼び出し関係にあるなどです。 |
エラーの構文 |
エラーの説明 |
---|---|
AV0001: 無効な依存関係: Artifact1(ArtifactType1) --> Artifact2(ArtifactType2) レイヤー: LayerName1, LayerName2 | 依存関係: DependencyType |
LayerName1 は LayerName2 に直接依存していないため、LayerName1 の Artifact1 を、LayerName2 の Artifact2 に依存させることはできません。 |
AV1001: 無効な名前空間: Artifact レイヤー: LayerName | 必要な名前空間: NamespaceName1 | 現在の名前空間: NamespaceName2 |
LayerName では、関連する成果物が NamespaceName1 に属する必要があります。 Artifact は NamespaceName1 ではなく、NamespaceName2 にあります。 |
AV1002: 禁止された名前空間への依存: Artifact1(ArtifactType1) | Artifact2(ArtifactType2) レイヤー: LayerName | 禁止された名前空間: NamespaceName | 依存関係: DependencyType |
LayerName では、関連する成果物を NamespaceName に依存させないようにする必要があります。 Artifact2 は NamespaceName にあるため、Artifact1 を Artifact2 に依存させることはできません。 |
AV1003: 禁止された名前空間内: Artifact(ArtifactType) レイヤー: LayerName | 禁止された名前空間: NamespaceName |
LayerName では、関連する成果物を NamespaceName に所属させることはできません。 Artifact は NamespaceName に所属しています。 |
AV3001: 不足しているリンク: 'Artifact' へのレイヤー 'LayerName' リンクが見つかりません。 アセンブリ参照が存在することを確認してください。 |
成果物への LayerName リンクが見つかりません。 たとえば、モデリング プロジェクトでクラスを含むアセンブリへの参照が欠落しているために、クラスへのリンクが欠落している場合があります。 |
AV9001: アーキテクチャの検証で内部エラーが検出されました。 結果が不完全である可能性があります。 詳細については、ビルド イベント ログの詳細または出力ウィンドウを参照してください。 |
詳細については、ビルド イベント ログまたは出力ウィンドウを参照してください。 |