Возможно, одним простым и понятным подходом было бы добавить прокси-API, который дублирует все ваши методы API и предоставляет их клиенту. При вызове прокси-сервер либо перенаправляет вызов вашему реальному методу, либо возвращает ошибку «не лицензирован». Прокси-серверы могут быть встроены в три отдельных (базовый, промежуточный, все) класса, и ваш сервер будет создавать экземпляры подходящего прокси-сервера для лицензии вашего клиента. Преимущество этого состоит в минимальном снижении производительности (поскольку вы проверяете лицензию только один раз). Возможно, вам даже не понадобится использовать прокси-сервер для уровня «все», поэтому он получит максимальную производительность. Это может быть сложно, в зависимости от вашего существующего дизайна.
Другая возможность может состоять в том, чтобы перепроектировать и разбить ваши API-интерфейсы на базовые / промежуточные / все «разделы» и поместить их в отдельные сборки, чтобы лицензия могла включать / отключать всю сборку, и пытаться вызвать нелицензионный Метод может просто вернуть ошибку «метод не найден» (например, исключение TypeLoadException произойдет автоматически, если вы просто не загрузили нужную сборку). Это значительно упростит тестирование и обслуживание, а также позволит избежать проверки на уровне отдельных методов.
Если вы не можете сделать это, по крайней мере, попытайтесь использовать более централизованную систему, чем оператор «если», написанный от руки в каждом методе.
Примеры (которые могут или не могут быть совместимы с вашим существующим дизайном) будут включать:
Добавьте пользовательский атрибут к каждому методу и попросите серверный код отправки проверить этот атрибут с помощью отражения, прежде чем он передаст вызов в метод.
Добавьте пользовательский атрибут, чтобы пометить метод, и используйте PostSharp, чтобы добавить стандартный бит кода в метод, который будет считывать и проверять атрибут на соответствие лицензии.
Используйте PostSharp, чтобы добавить код для тестирования лицензии, но поместите детали лицензии для каждого метода в систему с большим количеством данных (например, используйте XML-файл, а не атрибуты для описания разрешений метода). Это позволит вам легко изменить лицензирование для всего сервера, отредактировав один файл, и позволит вам легко добавлять новые уровни или типы лицензий в будущем.
Надеюсь, это даст вам некоторые идеи.