检测Asp.Net页面引用其他页面(使用NDepend?FXCop?)
我需要找到所有派生自“System.Web.UI.Page”的类,它引用从Page派生的另一个类...并且我在NDepend中尝试的所有内容都不会给我提供任何内容或每页。
我们最近将一个Asp.Net“网站”转换为“Web应用程序”,并在该过程中发现许多页面与我们的数据库层中的类具有相同的类名。 它们位于不同的名称空间中,但由于所有页面都位于同一个名称空间中(现在,它们位于同一个程序集中),所以我们遇到了一些问题。
大多数情况下,当页面使用数据层类并访问它的成员时,会导致编译错误,但现在所有页面都位于Web应用程序中(因此可以互相看到),因此编译器确定它们正在引用Web页面类而不是数据层类。 我们担心有些类可能会在编译时崩溃,可能会实现一个名称相同的成员,所以我们希望找到.Net认为某个网页(一个继承(但远程)来自System.Web.UI.Page)具有对另一个网页的引用。
显然,这个NDepend CQL只返回所有的页面:
SELECT TYPES FROM ASSEMBLIES "UI"
WHERE IsUsing "System.Web.UI.Page"
AND DeriveFrom "System.Web.UI.Page"
有谁知道这是否可能,或者如果我可以使用FXCop或其他方法编写规则?
我不知道有什么方法可以使用CQL来做到这一点,尽管我不够CQL专家来确保这是不可能的。 另一方面,使用FxCop来查找这样的问题是非常可行的。 下面的规则代码应该会发现你的问题,但它确实只适用于一次性筛选。 如果您正在寻找永久包含在FxCop分析中的内容,则需要稍微想象一下。
private TypeNode PageType { get; set; }
private TypeNode FocalType { get; set; }
public override void BeforeAnalysis()
{
base.BeforeAnalysis();
this.PageType = FrameworkTypes.Page;
}
public override ProblemCollection Check(TypeNode type)
{
if (type.IsDerivedFrom(this.PageType))
{
this.FocalType = type;
this.Visit(type);
}
return this.Problems;
}
public override void VisitTypeReference(TypeNode type)
{
if ((type != null) && (type != this.FocalType) && type.IsDerivedFrom(this.PageType) && (!this.FocalType.IsDerivedFrom(type)))
{
this.Problems.Add(new Problem(this.GetResolution(type.FullName), type));
}
base.VisitTypeReference(type);
}
我们希望找到任何地方.Net认为一个Web页面(一个从System.Web.UI.Page继承(但远离)的类)具有对另一个Web页面的引用。
Jaykul,通过LINQ(CQLinq)的以下代码查询可以实现这一点:
let pageTypes = Application.Assemblies.WithNameLike("UI")
.Where(t => t.DeriveFrom "System.Web.UI.Page")
from t in pageTypes
let pageTypesUsed = t.TypesUsed.Intersect(pageTypes)
where pageTypesUsed.Count() > 0
select new { t, pageTypesUsed }
另外你写道:
我们发现很多页面与我们的数据库层中的类具有相同的类名
NDepend提出了超过200个默认代码规则,其中之一是避免具有不同类型的同名
链接地址: http://www.djcxy.com/p/37709.html上一篇: Detect Asp.Net Pages referencing other Pages (using NDepend? FXCop?)