Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 集成许可证处理的设计选择_C#_.net_Design Patterns - Fatal编程技术网

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

C# 集成许可证处理的设计选择,c#,.net,design-patterns,C#,.net,Design Patterns,对于我们的.Net应用程序,我们已将许可组件集成到该应用程序中。在应用程序代码中,我们验证许可证,并在此基础上启用/禁用某些功能。例如,如果用户拥有试用许可证,他们只能访问应用程序的特定部分,而付费用户可以访问任何部分。 我需要帮助决定设计,使影响最小。我不想在代码中散布if..else语句。请与我分享一些实现这一目标的最佳方法 您是否反对使用If/Else语句来检查已启用的功能,或者特别是在主程序逻辑中询问许可证系统 我不知道如何在没有If/Else语句的情况下禁用功能,但是如果您有一个许可证

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

您是否反对使用If/Else语句来检查已启用的功能,或者特别是在主程序逻辑中询问许可证系统

我不知道如何在没有If/Else语句的情况下禁用功能,但是如果您有一个许可证类可以为您处理所有事情,那么您可以将其保持整洁

我将有一个在应用程序启动时初始化的许可证类,并且有一个
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),并且应用程序的其余部分不需要触摸。

与往常一样,答案是

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

例如,假设您有一个封装在
IPrinter
接口后面的打印功能。在
RealPrinter
类中实现real功能,在
NullPrinter
类中实现disable功能,这两个功能都实现了
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();
    }
}

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


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

检查应该静态地进行,这样如果验证第一次通过,那么如果功能A被实例化,就不应该再次检查验证。静态授权管理器类可能可以处理此问题

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