使用 PostSharp 一次验证多个项目中的类名



我有一个解决方案,其中包含不同命名空间中的多个 API 项目。我正在寻找一种同时验证所有 API 项目的方法,以检查其中是否有任何项目具有与这些项目中的另一个类同名的类(控制器(。

假设我有以下类:

Api1.DogController
Api1.CatController
Api2.BirdController

现在有人向Api2添加了一个新的CatController,所以我们有

Api2.BirdController
Api2.CatController

我希望 PostShart 抛出一个构建错误,因为Api1项目中已经存在一个名为CatController的类。而且我宁愿避免向应该检查的类添加任何属性。不过,我可以在 API 项目的文件中引用AssemblyInfo约束。

我尝试用ScalarConstraint和类型做一些事情,如下所示:

[MulticastAttributeUsage(MulticastTargets.Class)]
public class ControllerNamesValidation : ScalarConstraint
{
public override void ValidateCode(object target)
{
var targetType = (Type)target;
//various experiments with targetType.GetMembers() or targetType.GetNestedTypes() here...
}
}

但失败了。

PostSharp单独处理每个项目。可以使用 ScalarConstraint 在构建时在解决方案范围内强制实施规则,但您需要将有关所用控制器名称的信息存储在某个位置(例如文件系统或注册表(。这需要同步,这可能会增加编译时间。

如果单个项目引用了所有 API 库,则还可以通过面向程序集而不是类,然后在约束逻辑中反映程序集来实现相同的效果(请参阅 Assembly.GetReferencedAssemblies(。您可以按自定义属性的存在来筛选已处理的程序集。

最新更新