Прежде чем я начну говорить о том, как сделать это с VAB, позвольте мне сказать, что вам придется по-настоящему обдумать свои правила валидации.Хотя разграничение валидаций между ролями возможно, это означает, что объект, который пользователь сохраняет в одной роли, недопустим для другого пользователя.Это означает, что пользователю в определенной роли может потребоваться изменить этот объект, прежде чем он сможет его сохранить.Это также может произойти для того же пользователя, когда он повышен до другой роли.Если вы уверены в этом, пожалуйста, читайте дальше.
Это похоже на хорошую работу для блока приложения проверки библиотеки предприятия (VAB), поскольку она позволяет проверять эти сложные сценарии.Если вы хотите сделать это, забудьте проверку на основе атрибутов;это просто не сработает.Для этого вам потребуется проверка на основе конфигурации.
Что вы можете сделать с помощью VAB, это использовать файл конфигурации, который содержит фактическую проверку.Это немного зависит от того, какими должны быть действительные правила валидации, но вы можете создать базовую конфигурацию, которая всегда сохраняется для каждого объекта в вашем домене.А затем создайте одну или несколько конфигураций, которые содержат только расширенных проверок.Скажем, например, что у вас есть файл validation_base.config
, файл validation_manager.config
и validation_admin.config
.
Что вы можете сделать, это объединить эти проверки вместе в зависимости от роли пользователя.Посмотрите, например, на этот пример, который создает три источника конфигурации на основе файла конфигурации:
var base = new FileConfigurationSource("validation_base.config");
var mngr = new FileConfigurationSource("validation_manager.config");
var admn = new FileConfigurationSource("validation_admin.config");
Теперь вам нужно объединить эти файлы в (как минимум) две конфигурации.Один содержит базу + менеджер, а другой содержит правила база + администратор.Хотя слияние не является чем-то, что поддерживается из коробки, эта статья покажет вам, как это сделать.Используя код из этой статьи, вы сможете сделать следующее:
var managerValidations =
new ValidationConfigurationSourceCombiner(base, mngr);
var adminValidations =
new ValidationConfigurationSourceCombiner(base, admn);
Последнее, что вам нужно сделать, это обернуть эти проверки в класс, который возвращает правильный набор, основанный на ролиПользователь.Вы можете сделать это следующим образом:
public class RoleConfigurationSource : IConfigurationSource
{
private IConfigurationSource base;
private IConfigurationSource managerValidations;
private IConfigurationSource adminValidations;
public RoleConfigurationSource()
{
this.base = new FileConfigurationSource("validation_base.config");
var mngr = new FileConfigurationSource("validation_manager.config");
var admn = new FileConfigurationSource("validation_admin.config");
managerValidations =
new ValidationConfigurationSourceCombiner(base, mngr);
adminValidations =
new ValidationConfigurationSourceCombiner(base, admn);
}
public ConfigurationSection GetSection(string sectionName)
{
if (sectionName == ValidationSettings.SectionName)
{
if (Roles.UserIsInRole("admin"))
{
return this.adminValidations;
}
else
{
return this.managerValidations;
}
}
return null;
}
#region IConfigurationSource Members
// Rest of the IConfigurationSource members left out.
// Just implement them by throwing an exception from
// their bodies; they are not used.
#endregion
}
Теперь этот RoleConfigurationSource
можно создать один раз, и вы можете предоставить его при проверке ваших объектов следующим образом:
static readonly IConfigurationSource validationConfiguration =
new RoleConfigurationSource();
Validator customerValidator =
ValidationFactory.CreateValidator<Customer>(validationConfiguration);
ValidationResults results = customerValidator.Validate(customer);
if (!results.IsValid)
{
throw new InvalidOperationException(results[0].Message);
}
Обратите внимание, чтоблок приложения проверки не является простой структурой.Это займет некоторое время, чтобы выучить это.Когда ваше приложение достаточно велико, ваши конкретные требования, тем не менее, оправдывают его использование.Если вы выбираете VAB, начните с чтения документа « Hands-On Labs ».Если у вас возникли проблемы, возвращайтесь сюда в SO; -)
Удачи.