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