Подтвердить что ты не робот

Выполнить набор шаблонов класса ValidationRule-С# - лучший подход

У меня есть случай, когда мне нужно выполнить набор правил проверки для разных компаний. Существует несколько правил валидации в отношении одной компании.

Итак, у меня есть следующая таблица Структура

Компания

ID      CompanyName  
1       ABC   
2       DEF  

ValidationRule

RuleID      Name  
1           Rule1   
2           Rule2 

CompanyValidationRuleMapping

MappingID      CompanyId    RuleID
1              1             1
2              1             2
3              2             2

У меня есть отдельные хранимые процедуры для каждого правила проверки.

Итак, из моего кода С# я найду все правило проверки, соответствующее компании, и вам нужно выполнить хранимую процедуру проверки, связанную с этим правилом.

Итак, я планирую оставить один интерфейс "Ивалити", который имеет разные методы проверки.

или

Могу ли я создать разные классы для каждой проверки, которая реализует интерфейс

Может кто-нибудь предложить лучший подход к этому.

4b9b3361

Ответ 1

Первый уровень общего интерфейса проверки, который обеспечивает гибкость предоставления как типа результата, так и модели, подлежащей проверке:

public interface IValidate<T, R>
    where T : class
    where R : class // where T is any custom result and R is your custom model
{
    T Validate(R model);
}

Скажем, мне нужно проверить политику компании, которая будет обрабатываться другим sp в целом:

public interface IValidateCompanyPolicies : IValidate<ValidationResult1, Company>
{
  ValidationResult1 Validate(Company model);
}

Опять же, мне также нужно проверить денежные счета компаний, налоги, аудиты и т.д.:

public interface IValidateCompanyAccounts : IValidate<ValidationResult2, Company>
{
  ValidationResult2 Validate(Company model);
  bool HasAuditPassed(Company model);
}

Респ. классы, обрабатывающие оба типа интерфейса IValidate

public class ValidateCompanyPolicies : IValidateCompanyPolicies
{
    ValidationResult1 Validate(Company model)
    {
        // Hit stored procedure corresponding to company policies validation
    }
}

public class ValidateCompanyAccounts : IValidateCompanyAccounts
{
    ValidationResult2 Validate(Company model)
    {
        // Hit stored procedure corresponding to company monetary accounts validation
    }

    bool HasAuditPassed(Company model)
    {
        // Hit stored procedure corresponding to get company audit results
    }
}

Мой конечный класс, который должен выполнить все бизнес-операции после выполнения проверки:

public class XYZCompany
{
    private IValidateCompanyPolicies companyPoliciesValidation;

    private IValidateCompanyAccounts companyAccountsValidation;

    public XYZCompany(
        IValidateCompanyPolicies companyPoliciesValidation,
        IValidateCompanyAccounts companyAccountsValidation)
    {
        // Perform DI
    }

    public bool UpdateCompany(Company model)
    {
        var checkPolicies = this.companyPoliciesValidation.Validate(model);

        if (checkPolicies.Success)
        {
            var checkAccounts = this.companyAccountsValidation.Validate(model);

            var auditSuccess = this.companyAccountsValidation.HasAuditPassed(model);

            if (checkAccounts.Success && auditSuccess)
            {
                // Perform DB save
            }
        }
    }
}

Ответ 2

Существует несколько сценариев:

  • Если все параметры Valudation SP имеют одинаковые параметры и результаты, вы можете создать один класс для вызова всех SP и просто сохранить имена SP в таблице CompanyValidationRuleMapping. Видеть Вызывается SP из другого SP

  • Если каждый SP очень различен, тогда вам понадобится другой класс для каждого SP

Я бы рекомендовал создать все SP с теми же параметрами и результатом, так как этот подход будет легче расширять и изменять.