Что вы можете сделать, это создать интерфейс:
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
}
}
Если вы используете внедрение зависимостей, go и зарегистрируйте это как синглтон. Если вы не используете 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.