Проверяйте имена классов в нескольких проектах одновременно, используя PostSharp - PullRequest
2 голосов
/ 30 января 2020

У меня есть решение с несколькими API-проектами в различных пространствах имен. Я ищу способ проверить все проекты API одновременно, чтобы проверить, есть ли у любого из них класс (контроллер) с тем же именем, что и у другого класса в любом из этих проектов.

Давайте скажем, у меня есть следующие классы:

Api1.DogController
Api1.CatController

Api2.BirdController

Теперь кто-то добавляет новый CatController к Api2, поэтому у нас есть

Api2.BirdController
Api2.CatController

Я бы хотел, чтобы PostShart выдавал ошибку сборки, потому что класс с именем CatController уже существует в проекте Api1. И я предпочел бы избежать необходимости добавлять какие-либо атрибуты в классы, которые должны проверяться. Я согласен со ссылкой на ограничение в файле AssemblyInfo проектов API.

Я попытался сделать некоторые вещи с ScalarConstraint и типами, например:

[MulticastAttributeUsage(MulticastTargets.Class)]
    public class ControllerNamesValidation : ScalarConstraint
    {
        public override void ValidateCode(object target)
        {
            var targetType = (Type)target;

            //various experiments with targetType.GetMembers() or targetType.GetNestedTypes() here...
        }
     }

, но не смог .

1 Ответ

2 голосов
/ 31 января 2020

PostSharp обрабатывает каждый проект отдельно. Можно использовать ScalarConstraint для принудительного применения вашего правила во время сборки, но вам нужно где-то хранить информацию об используемых именах контроллеров (например, файловой системе или реестре). Это требует синхронизации, что может добавить время к вашей компиляции.

Если все ваши библиотеки API ссылаются на один проект, вы также можете добиться того же эффекта, нацелив Assembly вместо Class, а затем подумав о сборка в логах ограничений c (см. Assembly.GetReferencedAssemblies ). Вы можете фильтровать обработанные сборки по наличию пользовательского атрибута.

...