【问题标题】:Detect Asp.Net Pages referencing other Pages (using NDepend? FXCop?)检测引用其他页面的 Asp.Net 页面(使用 NDepend?FXCop?)
【发布时间】:2012-02-15 14:54:17
【问题描述】:

我需要找到从“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 或其他东西编写规则?

【问题讨论】:

    标签: asp.net code-analysis fxcop ndepend


    【解决方案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);
    }
    

    【讨论】:

    • 这看起来不错 - 会尝试一下(事实上,它只是我需要的一次性)。
    【解决方案2】:

    我们希望找到 .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

    【讨论】:

    • 优秀。我以为我在某个地方读过类似的东西。如果有这个,我会很高兴的 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多