如何将许可代码分成几层?一个用于验证,另一个用于许可证创建

时间:2018-09-17 16:04:32

标签: oop design-patterns licensing

我正在为我的内部项目开发许可体系结构。 (没有空间支付金雅拓的额外费用)。我的许可证管理者将承担两项职责,

  1. 从文件中读取并验证许可(将在 我创建的应用程序)
  2. 使用提供的信息生成许可证文件(将作为内部工具保留在我的手中)

现在,第1部分和第2部分将依赖于相同的加密-解密和序列化-反序列化逻辑。

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

我在这里需要以这样一种方式来构造我的许可证管理器类:仅将第1部分所需的代码(即解密和读取)发送给客户。另一部分总是留在我身上。

此处的目的不是重复代码。取决于相同的逻辑。 有没有任何标准的方法可以做到这一点,或者有任何可以解决这种情况的设计原则。

我已经考虑过使用ISP(接口隔离主体)和代理模式。 但无论如何,两者都需要运输整个组件。另一种选择是分离逻辑并将它们编写在单独的程序集中。

1 个答案:

答案 0 :(得分:1)

我不会担心代码,即“加密”已交付给客户端,这并不重要。重要的是要保留用于生成有效许可证的私有密钥,并将公共密钥随应用程序一起提供。

因此,如果您希望将加密与解密分开的原因是“安全性”,那么我认为将私有密钥保密可以很好地解决此问题。

话虽如此,从面向对象的角度来看,我将对问题进行不同的建模。问题的核心是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...) {
        ...
    }
}

在此设计中,您基本上始终仅实现一个接口,并且仍然可以区分许可证的创建和使用。如果您现在仅需要基于文件的许可证(KISS,YAGNI),则还可以将文件功能的存储/加载直接放入License类中。