2012-02-15 86 views
1

我需要找到“System.Web.UI.Page”,它引用从页派生另一个类派生的所有类...一切我尝试在NDepend中,不会给我任何东西或每页。检测Asp.Net页面引用其他页面(使用NDepend的?FxCop的?)

最近我们转换一个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或别的什么规则?

回答

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); 
} 
+0

这看起来不错 - 要去尝试它(这是,其实只是一次性的,我需要)。 – Jaykul 2012-02-15 20:05:08

+0

工作过,谢谢! – Jaykul 2012-02-15 22:56:09

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

+0

非常好。我以为我曾经在某处读过类似的东西。会有这样的摇摆来为这个;-) – Jaykul 2012-02-23 03:51:04

相关问题