在我开始讨论如何使用 VAB 执行此操作之前,让我说您必须认真考虑您的验证规则。虽然区分角色之间的验证是可能的,但这确实意味着一个角色中的用户保存的对象对另一个用户无效。这意味着具有特定角色的用户可能需要更改该对象才能保存它。当同一用户被提升为另一个角色时,这也可能发生在同一用户身上。如果您确定要这样做,请继续阅读。
这对于 Enterprise Library 的 Validation Application Block (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");
现在您必须将这些文件合并到(至少)两个配置中。一个包含基本 + 管理器,另一个包含基本 + 管理规则。虽然开箱即用不支持合并,但this article 将向您展示如何进行。使用该文章中的代码时,您将能够做到这一点:
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”文档。如果您有问题,请回到这里 ;-)
祝你好运。