Как разделить лицензионный код на слои?Один для проверки, а другой для создания лицензии - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю над архитектурой лицензирования для своих внутренних проектов. (Нет места для дополнительной стоимости Gemalto). У моего менеджера лицензий будет две обязанности,

  1. Чтение из файла и проверка лицензии (для использования в приложения, которые я создаю)
  2. Создание файла лицензии с предоставленной информацией (останется со мной как внутренний инструмент)

Теперь части 1 и 2 будут зависеть от одной и той же логики шифрования-дешифрования и сериализации-десериализации.

public interface ILicenseManager
{
    License ValidateAndGetLicense();
    void CreateLicense(License license);
}

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

Цель здесь - не повторять код. Зависит от той же логики. Есть ли какой-либо стандартный способ сделать это или любой принципал, который обрабатывает эту ситуацию.

Я рассмотрел использование ISP (принцип сегрегации интерфейса) и шаблона Proxy. Но тем не менее, обоим потребуется целая сборка для отправки. Другой вариант - разделить логику и записать их в отдельных сборках.

1 Ответ

0 голосов
/ 17 сентября 2018

Я бы не беспокоился о коде, то есть о «шифровании», отправляемом клиенту, это не важно. Важным моментом является то, что вы сохраняете закрытый ключ , используемый для создания действительных лицензий, и отправляете свой открытый ключ вместе с приложением.

Итак, если ваши причины отделить шифрование от дешифрования - это «безопасность», я думаю, это достаточно хорошо, если вы храните свой секретный ключ в секрете.

При этом, с точки зрения объектной ориентации, я бы смоделировал проблему по-другому. Суть вашей проблемы - License, которая должна была бы проверить себя в данный момент времени, поэтому:

public interface License {
    boolean validNow(); // Or whatever you need
}

Затем просто создайте реализацию, которая читает из файла:

public final class FileLicense {
    ...
}

Таким образом, на данный момент вы можете читать и проверять лицензии из файла.

Хорошо, так как же «создать» License. Самый простой способ (который в зависимости от ваших требований может подходить или не подходить) состоит в том, чтобы просто создать другую реализацию, например:

public final class NewLicense {
    ...
    public NewLicense(PrivateKey companyKey, license data...) {
        ...
    }
}

В этом проекте вы в основном просто реализуете интерфейс и можете разделять создание и использование лицензий. Вы также можете поместить функцию сохранения / загрузки из файлов непосредственно в класс License, если вам сейчас нужны только файловые лицензии (KISS, YAGNI).

...