2012-02-15 35 views
1

ページから派生した別のクラスを参照する "System.Web.UI.Page"から派生したすべてのクラスを見つける必要があります。 NDependで私に何も、またはすべてのページを与えます。他のページを参照するAsp.Netページを検出する(NDepend?FXCopを使用)

最近、Asp.Netの「サイト」を「Webアプリケーション」に変換しました。その過程で、多くのページがデータベースレイヤのクラスと同じクラス名を持つことがわかりました。それらは異なる名前空間にありますが、すべてのページが同じ名前空間にあり(今は同じアセンブリ内にあります)、いくつかの問題があります。

ほとんどの場合、ページがデータレイヤークラスを使用してそのメンバーにアクセスしたときにコンパイルエラーが発生しましたが、すべてのページがWebアプリケーション内にあり(コンパイル時には)データ層クラスではなくウェブページクラスを参照していました。私たちは、おそらく同じ名前のメンバーを実装することによって、コンパイル時のクラッシュを過ぎてしまったクラスがあるかもしれないことを心配しています。つまり、.NetがWebページ(ただし遠くに継承するクラス) System.Web.UI.Pageから)は、別のWebページへの参照を持っています。

明らかにこれNDependのCQLは、ちょうどすべてのページを返します。

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

私はFxCopのか、何か他のものを使用してルールを記述することができれば誰でもこれが可能かどうかを知り、またはしていますか?

答えて

1

私はCQLを使ってこれを行う方法は知らないが、それは不可能であることを確かめるのにCQLの専門家では不十分である。一方、FxCopを使用してこのような問題を見つけることは非常に実現可能です。次のルールコードはあなたの問題を見つけるはずですが、実際には1回のみのスクリーニングに適しています。あなたが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

+0

トリックに感謝しました! – Jaykul

0

我々は、.NETは、Webページ((ただし遠縁)System.Web.UI.Pageから継承したクラス)が別のWebページへの参照を持っていることを考えて任意の場所を見つけたいです。

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は以上を提案しています、そのうちの1つはAvoid having different types with same name

+0

優れています。私はどこかのようなものを読んだと思った。この1つのためにそれを持ってきただろうか;-) – Jaykul

関連する問題