集成许可证处理的设计选择

时间:2011-04-11 04:06:10

标签: c# .net design-patterns

对于我们的.Net应用程序,我们已将许可组件集成到应用程序中。在应用程序代码中,我们验证许可证,并在此基础上我们需要启用/禁用某些功能。例如,如果用户具有试用许可证,则他们只能访问应用程序的特定部分,而付费用户可以访问任何部分。 我需要帮助决定设计,以便影响最小。我不想在if..else语句中撒上代码。请与我分享一些实现这一目标的最佳方法。

4 个答案:

答案 0 :(得分:5)

与往常一样,答案是replace conditional with polymorphism

将每个功能封装为Strategy,并将禁用的功能实现为Null Object。然后可以将两者封装在条件Composite中,该条件{{3}}基于许可组件在两者之间进行选择。

例如,假设您在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();
    }
}

答案 1 :(得分:2)

您是否反对使用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),并且不需要触及其他应用程序。

答案 2 :(得分:1)

您可以计划拥有多个“许可产品”,每个产品都有自己的一组唯一许可证密钥。产品A可以解锁功能1,2和3而产品B只能解锁功能1.在实例化功能1的构造函数中,您可以检查特定的许可代码,以检查此许可证密钥是否对产品A有效或产品B.您可以对功能2和3执行相同操作,功能2和3仅检查与产品B相关的许可证密钥。

检查应该是静态完成的,这样如果验证第一次通过,那么如果要实例化功能A,则永远不应再次检查验证。静态许可管理器类可以处理这个问题。

如果有试用许可证密钥且某些功能被禁用,我会将该试用日期嵌入到许可证密钥中 - 因此,即使许可证密钥已经过验证,如果您看到试用日期,它也会例外构造函数级别。

答案 3 :(得分:0)

也许你可以使用这里描述的.NET licx技术?

Licx based .NET licensing model