Проверка сборки сборки .Net (атрибуты и график вызовов) - PullRequest
1 голос
/ 30 августа 2011

Все методы в сборке помечены одним из двух атрибутов: [Узкое место] или [Кэширование].Методы [Caching] выполняют некоторое кэширование, и они должны быть реализованы самым ясным способом, поскольку они вызываются редко.Наоборот, методы [бутылочного горлышка] вызываются каждый раз, когда сборка используется сервером (достаточно часто), поэтому их следует оптимизировать.

Есть ли способ проверить: 1. Каждый метод помечен какодин из атрибутов.2. Ни один метод [Узкое место] не вызывает метод [Кэширование].

Я хотел бы интегрировать этот инструмент с VS 2010.

С уважением,

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Вы всегда можете написать свой собственный инструмент, используя либо отражение, Mono.Cecil , либо написать свое собственное правило FxCop / CodeAnalysis .

Вы также можете использовать NDepend , который позволяет вам в основном писать "SQL-подобные" запросы для ваших сборок. Используя этот CQL (Code Query Language), вы можете проверить свои ограничения. NDepend интегрируется в Visual Studio, а также имеет версию командной строки для автоматических сборок.

Особенно с вашим вторым требованием (граф вызовов) Я не уверен, что NDepend может это сделать. Ваши собственные инструменты могут, конечно, как это можно сделать с помощью пользовательского правила FxCop.

РЕДАКТИРОВАТЬ : Глядя на CQL-спецификацию NDepend , я бы сказал, что 2-е требование действительно (легко) выполнимо.

0 голосов
/ 10 июня 2012

Для уточнения христианского ответа, да, то, что вы просите, выполнимо с новой версией NDepend благодаря Запросу кода и правилу LINQ . Отказ от ответственности: я один из разработчиков инструмента

Каждый метод помечен одним из атрибутов

Просто напишите правило кода CQLinq:

warnif count > 0
from m in Application.Methods where 
 !m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
 !m.HasAttribute("MyNamespace.Caching") &&
 !m.HasAttribute("MyNamespace.Bottleneck")
select m

Нет, метод [Bottleneck] не вызывает метод [Caching].

Просто напишите немного более сложное правило кода:

warnif count > 0 

let bottleneckMethods = 
   from m in Application.Methods where 
     !m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
     !m.HasAttribute("MyNamespace.Bottleneck")
    select m

let cachingMethods = 
   (from m in Application.Methods where 
      !m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
      !m.HasAttribute("MyNamespace.Caching")
    select m).ToHashSet() // <-  ToHashSet() Just for optimization with Intersect()

from m in bottleneckMethods
let cachingMethodsCalled = m.MethodsCalled.Intersect(cachingMethods)
where cachingMethodsCalled.Count() > 0
select new { m, cachingMethodsCalled }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...