【问题标题】:Design choices for integrating license handling集成许可证处理的设计选择
【发布时间】:2011-05-23 12:14:41
【问题描述】:

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

【问题讨论】:

    标签: c# .net design-patterns


    【解决方案1】:

    一如既往,答案是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();
        }
    }
    

    【讨论】:

      【解决方案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),并且不需要触及应用程序的其余部分。

      【讨论】:

        【解决方案3】:

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

        检查应该静态地进行,如果验证第一次通过,那么如果特性 A 被实例化,那么你永远不应该再次检查验证。静态许可管理器类可能可以处理此问题。

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

        【讨论】:

          【解决方案4】:

          也许您可以使用此处描述的 .NET licx 技术?

          Licx based .NET licensing model

          【讨论】:

            猜你喜欢
            • 2017-10-10
            • 1970-01-01
            • 2016-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-21
            • 1970-01-01
            相关资源
            最近更新 更多