Я обычно использую класс спецификации,
он предоставляет метод (это C #, но вы можете перевести его на любой язык):
bool IsVerifiedBy(TEntity candidate)
Этот метод выполняет полную проверку кандидата и его отношений.
Вы можете использовать аргументы в классе спецификации, чтобы сделать его параметризованным, например, проверить уровень ...
Вы также можете добавить метод, чтобы узнать, почему кандидат не проверил спецификацию:
IEnumerable<string> BrokenRules(TEntity canditate)
Вы можете просто решить реализовать первый метод следующим образом:
bool IsVerifiedBy(TEntity candidate)
{
return BrokenRules(candidate).IsEmpty();
}
Для нарушенных правил я обычно пишу итератор:
IEnumerable<string> BrokenRules(TEntity candidate)
{
if (someComplexCondition)
yield return "Message describing cleary what is wrong...";
if (someOtherCondition)
yield return
string.Format("The amount should not be {0} when the state is {1}",
amount, state);
}
Для локализации вы должны использовать ресурсы, и почему бы не передать культуру в метод BrokenRules.
Я помещаю эти классы в пространство имен модели с именами, которые предлагают их использование.