【发布时间】:2011-05-23 12:14:41
【问题描述】:
对于我们的 .Net 应用程序,我们已将许可组件集成到应用程序中。在应用程序代码中,我们验证许可证并基于它启用/禁用某些功能。例如,如果用户拥有试用许可证,他们只能访问应用程序的特定部分,而付费用户可以访问任何部分。 我需要帮助来决定设计,以使影响最小。我不想在代码中添加 if..else 语句。请与我分享一些实现这一目标的最佳方法。
【问题讨论】:
标签: c# .net design-patterns
对于我们的 .Net 应用程序,我们已将许可组件集成到应用程序中。在应用程序代码中,我们验证许可证并基于它启用/禁用某些功能。例如,如果用户拥有试用许可证,他们只能访问应用程序的特定部分,而付费用户可以访问任何部分。 我需要帮助来决定设计,以使影响最小。我不想在代码中添加 if..else 语句。请与我分享一些实现这一目标的最佳方法。
【问题讨论】:
标签: c# .net design-patterns
一如既往,答案是replace conditional with polymorphism。
将每个功能封装为Strategy,将禁用的功能实现为Null Object。然后可以将两者都封装在有条件的Composite 中,根据许可组件在两者之间进行选择。
例如,假设您有一个封装在IPrinter 接口后面的打印功能。您在RealPrinter 类中实现了真正的功能,在NullPrinter 类中实现了禁用功能,两者都实现了IPrinter 接口。
许可证检查可以在 GuardedPrinter 类中实现,如下所示:
public class GuardedPrinter : IPrinter
{
private readonly IPrinter realPrinter;
private readonly IPrinter nullPrinter;
// more fields and initialization omitted for brevety...
public PrintResult Print()
{
if (this.licence.IsEnabled)
{
return this.realPrinter.Print();
}
return this.nullPrinter.Print();
}
}
【讨论】:
您是否反对使用 If/Else 语句来检查启用的功能,或者在您的主程序逻辑中专门询问许可系统?
我不明白如何在没有 If/Else 语句的情况下禁用功能,但如果你有一个为你处理所有事情的 License 类,你可以让它保持整洁。
我会有一个在应用程序启动时初始化的许可证类,并且有一个public bool IsFeatureLicensed(string MethodName) 方法。
提供您希望通过许可证保护的功能的每个方法都具有以下内容:
If (LicenceManager.IsFeatureLicensed(Reflection.MethodBase.GetCurrentMethod.Name)) {
//Do your stuff!
} else {
//Throw exception or show error message or something.
}
您创建的 LicenseManager 类中的 IsFeatureLicensed 方法将查看方法名称并检查许可证是否允许使用该方法提供的功能。它应该在所有情况下返回 True,除非许可证禁止使用该功能。
这样,每个方法都对许可管理器进行相同的调用(使其非常易于维护),并且与许可相关的所有内容都封装在一个类中。这使您可以非常轻松地更改您的许可方法(例如,您可以在开发过程中对所有内容都返回 True),并且不需要触及应用程序的其余部分。
【讨论】:
您可以计划拥有多个“许可产品”,每个产品都有自己的一组唯一许可证密钥。产品 A 可以解锁功能 1,2 和 3,而产品 B 只能解锁功能 1。在您的构造函数中实例化功能 1 的位置,您可以检查特定的许可代码以检查此许可密钥是否对产品 A 有效或产品 B。您可以对功能 2 和 3 执行相同的操作,仅检查与产品 B 相关的许可证密钥。
检查应该静态地进行,如果验证第一次通过,那么如果特性 A 被实例化,那么你永远不应该再次检查验证。静态许可管理器类可能可以处理此问题。
如果有试用许可证密钥并且某些功能被禁用,我会将该试用日期嵌入到许可证密钥中 - 因此,即使许可证密钥经过验证,如果您看到试用日期,它也会在构造函数级别。
【讨论】:
也许您可以使用此处描述的 .NET licx 技术?
【讨论】: