尝试将服务传递给我的自定义验证方法时,我遇到了一个奇怪的问题。
这是我的情景:
我正在实现一个导入过程,在服务器端执行大量工作。基本上,该进程读取一堆文件,并将这些文件中的数据导入数据库。我创建了一个DataProvider类,它基本上充当了我正在与之交互的所有数据的容器。我想从我的验证方法中查询此容器中的数据,因此需要ValidationContext
。我已经向我的主服务添加了一个属性,该服务包含我的数据提供者的实例,然后我将服务添加到ValidationContext
。我通过调用Validator.TryValidateObject
手动触发实体验证。
现在问题是:
出于某种原因,对于每种验证方法,ServiceContainer
对象中的ValidationContext
始终为空。我尝试了很多不同的东西,无法弄清楚为什么服务没有传递ValidationContext
。该服务在调用Validator.TryValidateObject
之前就已存在,但一旦到达ValidationMethod,服务就会消失。
我注意到并且现在用作解决方法的一个奇怪的事情是当我在我的实体类上使用IValidatableObject
接口时。在所需的Validate
方法内部,正确传递服务。
任何人都知道为什么服务会传递给这个方法而不是我的自定义验证方法?
*代码示例*
以下是我的域名服务的Initialize
方法:
public override void Initialize(DomainServiceContext context)
{
this.ValidationContext = new ValidationContext(this, context, null);
this.ValidationContext.ServiceContainer.AddService(typeof(MyDomainService), this);
base.Initialize(context);
this.DataProvider = new MyDomainServiceDataProvider(this.ObjectContext);
}
然后我有一个服务器端类(DataImporter),它包含一个为每个实体动态调用Validator.TryValidateObject
方法的方法。基本上,我正在从我的DomainService中的一个invoke方法创建一个DataImporter类的实例,并将我的DomainService的当前实例以及ObjectContext和ServiceContext传递给我的DataImporter。然后在我的DataImporter中,我有以下代码来创建ValidationContext
并调用特定于实体的ValidateEntity
方法:
ValidationContext validationContext = new ValidationContext(objectContextEntity, this.ServiceContext, null);
validationContext.ServiceContainer.AddService(typeof(PSSpecDomainService), this.DomainService, true);
MethodInfo validateEntityMethod = objectContextEntity.GetType().GetMethod("ValidateEntity");
validateEntityMethod.Invoke(objectContextEntity, new object[] { validationContext });
在我的每个实体上,我有一个名为ValidateEntity
的方法,它将调用Validator.TryValidateObject
方法。这是该方法的简化版本。
public bool ValidateEntity(ValidationContext validationContext = null)
{
validationContext = validationContext != null ? validationContext : new ValidationContext(this, null, null);
validationContext = validationContext != null ? validationContext : new ValidationContext(this);
return Validator.TryValidateObject(this, validationContext, this.ValidationErrors, true);
}
最后,这是我的自定义验证方法的开始:
public static ValidationResult IsSomethingValid(string changedValue, ValidationContext context)
{
[...]
}
当我进入实体ValidateEntity
方法时,ValidationContext参数包含我提供的服务,但是当我到达自定义验证方法时,服务不再存在(ServerContainer为空)。 / p>
我今天注意到的另一件事是,当我不手动启动验证时,我的Validate
方法(IValidatableObject
所需的)不包含与此相同的服务我手动触发验证请求。我错过了什么吗?