我正在为我的内部项目开发许可架构。(没有空间支付金雅拓的额外费用(。我的许可证经理将有两个职责,
- 从文件中读取并验证许可证(将在 我创建的应用程序(
- 使用提供的信息生成许可证文件(将作为内部工具留在我身边(
现在,第 1 部分和第 2 部分将依赖于相同的加密-解密和序列化-反序列化逻辑。
public interface ILicenseManager
{
License ValidateAndGetLicense();
void CreateLicense(License license);
}
我需要在这里构建我的许可证管理器类,以便只有第 1 部分(即解密和读取(所需的代码才能交付给客户。另一部分永远留在我身边。
此处的目的不是重复代码。依赖于相同的逻辑。 是否有任何标准方法或任何设计主体来处理这种情况。
我考虑过使用 ISP(接口隔离主体(和代理模式。 但是,两者都需要整个组件才能发货。另一种选择是分离逻辑并将它们编写在单独的程序集中。
我不会担心代码,即"加密"被运送到客户端,这并不重要。重要的部分是保留用于生成有效许可证的私钥,并将公钥与应用程序一起交付。
因此,如果您想要将加密与解密分开的原因是"安全性",我认为您保持私钥机密性足以涵盖这一点。
话虽如此,从面向对象的角度来看,我会以不同的方式对问题进行建模。问题的核心是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
类中。