是否可以在Visual Studio中限制程序集之间的依赖项?

but5z9lq  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(120)

是否可以对Visual Studio中项目之间允许的依赖项设置自动强制限制?
例如,假设我有三个简单的层; UI、业务和数据。我是否可以强制UI永远不要引用数据,并在发生这种情况时停止构建解决方案?
我希望一个坚持不懈的开发人员能够解决这个问题,但可以看到它在指导开发人员和早期检测错误方面的好处。

n3ipq98p

n3ipq98p1#

您不能直接或强制阻止引用,但您可以自己设置引用,这将有助于您的方案,因为人们将无法将引用添加回去(硬循环引用)。这并不能阻止人们使用像MEF或Unity这样的库,以一种非常松散的解耦方式到处跳跃--他们完全有可能解析或加载您不需要的程序集。不要期待并调用它们(我称之为逻辑循环依赖)。防止这种情况的唯一方法是通过代码审查保持警惕。
一旦正确设置了引用,就可以监控项目文件的更改,以告知何时添加了其他硬引用。任何源代码控制系统都可以轻松地进行版本比较,有些系统(例如TFS)甚至允许在特定文件更改时(例如项目文件更改时)通知您。
再一次,您拥有的最可靠的选择是代码评审。

nzkunb0c

nzkunb0c2#

我刚通过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

sqserrrh

sqserrrh3#

如果引用了不需要的程序集,您可以阻止生成项目,但如果只能通过某些外部工具来完成,则必须考虑使此检查的生成过程复杂化的相对优点。
如果引用了不需要的程序集,最好以编程方式使应用程序的启动失败。
下面的代码:

Assembly.GetExecutingAssembly()
        .GetReferencedAssemblies()
        .Select( a => a.Name )

将为您提供当前正在执行的程序集引用的所有程序集的名称。然后,您可以检查此名称列表是否包含不需要的程序集的名称。
有关详细信息,请参见https://stackoverflow.com/a/72460117/773113

相关问题