我有可以安装在一个或多个系统(服务器/桌面/硬件)上的软件产品,每个产品都有关于如何定义keyCode的逻辑(规范)。对于许多软件产品来说,这种逻辑可能是相同的,而且几乎没有什么变化。
产品->由ProductCode ->required唯一的keyCode定义用于安装
我需要根据该产品的密钥代码验证用户输入的密钥。
对于这种过程,什么是好的软件模式?
到目前为止,我所做的是
{
readonly arrayofproductCodes;
public CanProcess(string productCode)
{
return arrayofproductCodes.contains(productCode);
}
public validate(string keyCode)
{
return validation result;
}
}可能有几个软件产品和新的增加每隔一个月。
我觉得应该有一些创建模式来创建基于ProductsCode的实例化验证逻辑。
如果我的遗赠是清楚的请告诉我。
致以敬意,
3月
发布于 2020-02-03 22:45:53
您可以做的是创建一个接口:
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,您可以有另一个类,例如ProductValidatorProvider,在其中注入IEnumerable<IProductValidator>,将其转换为Dictionary<string, IProductValidator>,然后使用它找到正确的IProductValidator。
https://stackoverflow.com/questions/60047839
复制相似问题