Visual Studio のプロジェクト間で許可される依存関係に自動的に適用される制限を設定することは可能ですか?
たとえば、3 つの単純なレイヤーがあるとします。UI、ビジネス、データ。UI が Data への参照を決して保持しないように強制し、そのようなことが起こった場合にソリューションの構築を停止することはできますか?
粘り強い開発者はこれを回避できると期待していますが、開発者を導き、間違いを早期に検出するという点で、その利点を理解することができます。
Visual Studio のプロジェクト間で許可される依存関係に自動的に適用される制限を設定することは可能ですか?
たとえば、3 つの単純なレイヤーがあるとします。UI、ビジネス、データ。UI が Data への参照を決して保持しないように強制し、そのようなことが起こった場合にソリューションの構築を停止することはできますか?
粘り強い開発者はこれを回避できると期待していますが、開発者を導き、間違いを早期に検出するという点で、その利点を理解することができます。
参照を直接または強制的に防止することはできませんが、自分で参照を設定することはできます。これは、参照を元に戻すことができないため、シナリオに役立ちます (ハード循環参照)。これは、MEF や Unity などのライブラリを使用している人々が、非常に緩い分離された方法で飛び回るのを止めるものではありません。予期しないアセンブリを解決またはロードして、それらを呼び出す可能性は十分にあります (私はこれを論理循環と呼びます)。依存性)。これを防ぐ唯一の方法は、コード レビューによる警戒です。
参照を正しく設定したら、プロジェクト ファイルへの変更を監視して、他のハード参照がいつ追加されたかを知ることができます。どのソース管理システムもバージョン比較を簡単に行うことができ、一部 (TFS など) では、特定のファイルが変更されたとき (プロジェクト ファイルが変更されたときなど) に通知を受けることさえできます。
繰り返しになりますが、最も確実なオプションはコード レビューです。
Nuget経由でVisual Studio用のRef-Restrictをダウンロードしました。今のところ大丈夫そうです。
すべてのプロジェクトの参照を調べ、カスタム ルール セット (制限) に照らしてチェックします。ソリューションまたはプロジェクトがビルドされるときに、違反がある場合、ビルドは停止します。正確な問題は、Visual Studio のビルド エラーとして報告されます。
構成は次のようになります。
<rrconfig>
<!-- The core library should have no local dependencies -->
<!-- Data access libraries should not be included as data access should be in the data library -->
<rules project="RR.Core">
<nolocalrefs/>
<exclude>EntityFramework</exclude>
<exclude>EntityFramework.SqlServer</exclude>
</rules>
<!-- The data library should only have access to the core library and no other local libs. -->
<!-- Data access libraries should definitely be included -->
<rules project="RR.Data">
<onlylocalrefs>
<project>RR.Core</project>
</onlylocalrefs>
<include>EntityFramework</include>
<include>EntityFramework.SqlServer</include>
</rules>
</rrconfig>
ブログ: http://www.benibinson.com/blog/2014/8/31/restrict-project-references-with-ref-restrict
ソースとインストールの手順: https://github.com/CodeHex/Ref-Restrict