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

Validate class names in multiple projects at once using PostSharp

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

假设我有以下 classes:

Api1.DogController
Api1.CatController

Api2.BirdController

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

Api2.BirdController
Api2.CatController

我希望 PostShart 抛出构建错误,因为 Api1 项目中已经存在名为 CatController 的 class。而且我宁愿避免需要向 classes 添加任何应该检查的属性。不过,我可以在 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 库都被单个项目引用,您也可以通过以程序集而不是 Class 为目标来实现相同的效果,然后在约束逻辑中反映程序集(参见 Assembly.GetReferencedAssemblies)。您可以通过自定义属性的存在来过滤已处理的程序集。