Как использовать FluentValidation для эффективной проверки нескольких бизнес-правил, которые зависят от внешних данных? - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть несколько бизнес-правил для моего FormPartB объекта, которые зависят от связанных сущностей Licensee и FormPartA. Я новичок в FluentValidation.

Что (я думаю) я хочу сделать:

  • Внутри моих FormPartBValidator получите сущности Licensee и FormPartA один раз, затем установите набор правил (то есть предикатов Must()) для FormPartB, используя значения из этих связанных объектов.

  • т.е. Я не хочу снова извлекать обе внешние сущности в каждом определении правила.

У меня была пара мыслей:

(1) Получите эти сущности в конструкторе Validator выше моих RuleFor определений, затем сохраните эти сущности как частные поля,

public PartBValidator()
{
    // Get my external data and save as private fields

    RuleFor...
    RuleFor...
}

или

(2) Получите эти объекты в вызове Validate (), затем сохраните эти объекты как частные поля:

public override ValidationResult Validate(FormPartB instance)
{
    // Get my external data and save as private fields

    return base.Validate(instance);
}

Однако

  • В варианте (1) я не могу получить доступ к экземпляру FormPartB

  • В опции (2) Validate (), похоже, не работает так, как я думал (т.е. не вызывается при каждой проверке FormPartB.)

  • И я даже не уверен, что «получить объекты и сохранить как частные поля» - правильный путь.

Любой совет?

1 Ответ

4 голосов
/ 08 февраля 2012

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

Вот пример:

private readonly IFormService _service;

public PartBValidator(IFormService service)
{
    _service = service;

    var valueICareAbout = _service.GetMeFormAData();

    RuleFor...  // uses valueICareAbout
    RuleFor...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...