使用 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)。您可以通过自定义属性的存在来过滤已处理的程序集。
我有一个解决方案,其中有多个 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)。您可以通过自定义属性的存在来过滤已处理的程序集。