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

时间:2012-02-15 14:54:17

标签: asp.net code-analysis fxcop ndepend

我需要找到派生自“System.Web.UI.Page”的所有类,它们引用了另一个派生自Page的类...而我在NDepend中尝试的所有内容都不会给我任何内容或每一页。

我们最近将Asp.Net“站点”转换为“Web应用程序”,并在此过程中发现许多页面与我们数据库层中的类具有相同的类名。它们位于不同的命名空间中,但由于所有页面都位于相同的命名空间中(现在,它们位于同一个程序集中),因此我们遇到了一些问题。

大多数情况下,当页面使用数据层类并访问其成员时,这会导致编译错误,但现在所有页面都在Web应用程序中(因此可以看到彼此),编译器认为它们是引用网页类而不是数据层类。我们担心某些类可能已经通过实现具有相同名称的成员而滑过编译时崩溃,因此我们希望找到.Net认为web页面(继承的类(但远程)的任何地方)来自System.Web.UI.Page)有一个对另一个网页的引用。

显然,这个NDepend CQL只返回所有页面:

SELECT TYPES FROM ASSEMBLIES "UI" 
WHERE IsUsing "System.Web.UI.Page"
AND DeriveFrom "System.Web.UI.Page"

有人知道这是否可行,或者我是否可以使用FXCop或其他东西编写规则?

2 个答案:

答案 0 :(得分:1)

我不知道有任何方法可以使用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);
}

答案 1 :(得分:0)

  

我们希望找到.Net认为网页(从System.Web.UI.Page继承(但远程)的类)引用另一个网页的任何地方。

Jaykul,这可以通过以下Code Query over 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 default code rules,其中一个是Avoid having different types with same name