【发布时间】:2014-11-21 19:00:48
【问题描述】:
SonarQube 有一个纯 Java 架构规则引擎。我正在寻找一种为 C# .net 项目实现类似参考架构规则的方法。
例如:
- 禁止从
*.B.*类访问*.A.* - 强制至少一次从
*.C.*类访问*.A.*。
实现这一点的最佳方法是什么? 是否可以在 FXCop 中创建这些规则?
【问题讨论】:
SonarQube 有一个纯 Java 架构规则引擎。我正在寻找一种为 C# .net 项目实现类似参考架构规则的方法。
例如:
*.B.* 类访问*.A.* *.C.* 类访问*.A.*。实现这一点的最佳方法是什么? 是否可以在 FXCop 中创建这些规则?
【问题讨论】:
从长远来看,我们肯定希望通过 C# SonarQube 插件提供这种开箱即用的规则。
但是,与此同时,您确实可以开发自己的自定义 FxCop 规则(现有 C# SonarQube 插件支持),或者按照建议开发新的 SonarQube 插件以从不支持的工具(例如 Nitriq)导入问题.
如果您需要任何帮助,请随时查看 R# 插件并将请求发送到 SonarQube 开发邮件列表: https://github.com/SonarCommunity/sonar-resharper
【讨论】:
您可以使用Nitriq 创建规则:
禁止从 .B. 类访问 .A.
var results =
from t in Types
where t.Name.Equals("A") && t.TypesUsing.Any("B")
select new { t.TypeId, t.Name, t.FullName };
Warn(results, 0);
强制从 .C. 类中至少访问一次 .A.。
var results =
from t in Types
where t.Name.Equals("A") && !t.TypesUsing.Any("C")
select new { t.TypeId, t.Name, t.FullName };
Warn(results, 0);
另一种方法是使用Roslyn
【讨论】: