检测引用其他页面的Asp.Net页面(使用NDepend?FXCop?)



我需要找到从"System.Web.UI.Page"派生的所有类,这些类引用了从Page派生的另一个类。。。我在NDepend中尝试的所有东西要么什么都没有,要么每一页都没有。

我们最近将Asp.Net的"站点"转换为"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认为网页(一个从System.web.UI.Page继承(无论多么遥远)的类)引用另一个网页的任何地方。

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多个默认代码规则,其中之一是避免具有相同名称的不同类型

相关内容

  • 没有找到相关文章

最新更新