我有一个解决方案,其中包含不同命名空间中的多个 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(。您可以按自定义属性的存在来筛选已处理的程序集。