我们有一个使用 ServiceStack 作为后端的工作网站,相当于一个复杂的数据输入表单。
我的用户已请求表单的“离线编辑器”。要使用离线程序,用户必须连接到 ServiceStack 服务,创建表单的空实例,然后我将使用 ServiceStack 的 JSON 序列化程序将服务中的 POCO 保存到磁盘。用户可以从那里注销服务并编辑 POCO。完成后,他们重新连接到服务,并发布/放置编辑后的 POCO 对象。
这一切都很好。我的问题涉及验证。验证逻辑内置在我的 Service.Interface 库中,该库不能离线使用。winforms 程序仅引用 POCO 库和 ServiceStack“通用”库,它们看起来并不包含 ServiceStack.Validation 命名空间。
有没有办法可以重新安排我的项目,以便服务和 Winforms 客户端都可以针对 POCO 运行验证,以便他们可以在离线时进行数据验证?
更新:越来越近了,我想——我把所有的验证类都移到了他们自己的项目中。在我的 Winforms 项目中,我现在可以为 POCO 类手动设置验证器,如下所示:
ServiceStack.FluentValidation.IValidator<SomePOCO> IValidator;
IValidator = new Tonto.Svc.Validation.SomePOCOValidator();
ServiceStack.FluentValidation.Results.ValidationResult vr =
IValidator.Validate(_rpt);
我可以看到正在设置验证器构造函数并正在初始化规则,但是 .Validate 方法似乎没有做任何事情。(对象返回有效,并且自定义验证器代码中的断点永远不会到达那里)。
更新#2
我发现我的验证器代码没有从 Winforms 运行,因为我的验证器都只指定了一个 servicestack ApplyTo Put/Post(请参见下面的示例代码)。但是,当我删除整个规则集子句时,验证会在我的 GET 服务中发生——这是我永远不想要的。
任何人都可以想出一种方法来配置验证器规则,使其仅在从 ServiceStack 调用时运行 POST/PUT,但在不在 servicestack 中时也始终运行?很近!
public class SomePOCOValidator : AbstractValidator<SomePOCO>
{
public SomePOCO()
{
RuleSet(ApplyTo.Put | ApplyTo.Post, () =>
{
(rules)
});
}
}