Обнаружение страниц Asp.Net, ссылающихся на другие страницы (используя NDepend? FXCop?) - PullRequest
1 голос
/ 15 февраля 2012

Мне нужно найти все классы, производные от "System.Web.UI.Page", которые ссылаются на другой класс, производный от Page ... и все, что я пробую в NDepend, не дает мне ничего или каждую страницу.

Недавно мы преобразовали «сайт» Asp.Net в «веб-приложение» и обнаружили, что многие страницы имеют одинаковое имя класса с классами на уровне нашей базы данных. Они находятся в другом пространстве имен, но, поскольку все страницы находятся в одном и том же пространстве имен (и теперь находятся в одной сборке), у нас возникли некоторые проблемы.

В основном это вызывало ошибки компиляции, когда страница использовала класс слоя данных и обращалась к его члену, но теперь, когда все страницы находятся в веб-приложении (и, следовательно, могут видеть друг друга), компилятор решил, что они ссылка на класс веб-страницы, а не на класс слоя данных. Мы обеспокоены тем, что некоторые классы могли ускользнуть после сбоя во время компиляции, возможно, реализовав элемент с тем же именем, поэтому мы хотим найти любое место, где .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 или что-то еще?

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я не знаю, как это сделать, используя 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 голосов
/ 16 февраля 2012

мы хотим найти любое место, где .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 правил кода по умолчанию , одно из них Избегайте использования разных типов с одинаковыми именами

...