温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Validation Logic software Pattern
c# design-patterns

c# - 验证逻辑软件模式

发布于 2020-04-15 23:25:42

我有可以安装在一个或多个系统(服务器/台式机/硬件)上的软件产品。每个产品都有有关如何定义keyCode(规范)的逻辑。几乎没有什么变化的许多软件产品,其逻辑可能是相同的。

产品->由产品代码定义->所需的唯一密钥代码进行安装

我需要针对该产品的键码验证来验证用户输入的键。

对于这种过程,什么是好的软件模式?

我到目前为止所做的是

{
    readonly arrayofproductCodes;
    public CanProcess(string productCode)
    {
        return  arrayofproductCodes.contains(productCode);
    }


    public validate(string keyCode)
    {
        return validation result;
    }
}

可能有数百种软件产品,每隔一个月添加一次。

我觉得应该有一些创建模式来基于ProductsCode创建实例化验证逻辑。

让我知道我的问题是否清楚。

问候,

三月

查看更多

提问者
TheMar
被浏览
62
JohanP 2020-02-04 06:45

您可以做的是创建一个接口:

public interface IProductValidator
{
    bool CanProcess(string productCode);
    void Validate(string keyCode);
}

然后为您要验证的每个产品实现此接口:

public class XYZProductValidator : IProductValidator
{
     public bool CanProcess(string productCode)
     {
         return productCode == "XYZ";
     }

     public void Validate(string keyCode)
     {
         //validation logic
     }
}

如果您使用的是依赖注入,则将其注册为单例。如果您不使用DI,则需要一些工厂类来负责创建每个类。

在调用代码中,如果您使用的是DI,则可以插入IEnumerable<IProductValidator> productValidators

public class Calling
{
    private readonly IEnumerable<IProductValidator> _productValidators;

    public Calling(IEnumerable<IProductValidator> productValidators)
    {
        _productValidators = productValidators;
    }

    public void Validate(string productCode, string keyCode)
    {
        //find the right validator based on productCode
        var validator = _productValidators.Where(v => v.CanProcess(productCode));
        validator.Validate(keyCode);
    }

}

将来,当您添加更多产品时,通过这种方式,您所要做的就是实现IProductValidator接口,并且所有调用代码都将正常工作。现在,如果您担心循环遍历并IEnumerable查找正确的IProductValidator,则可以拥有另一个类,例如ProductValidatorProviderIEnumerable<IProductValidator>在其中注入in,将其转换为a Dictionary<string, IProductValidator>,然后使用它来查找正确的IProductValidator。