我目前正试图从我们的数据库模型类中删除所有业务逻辑,因此它们将只包含字段,获取器和设置器。现在,我对如何提取验证有些困惑。
我们的验证相当复杂,并且每个模型将在调用isValid()
时自行配置和运行其每个验证器。我已经将每个模型的验证提取到其自己的参数化验证类中,其中参数是它验证的对象的类型。
我很难解决的问题是提出一种将模型类与其验证类相关联的简单方法。模型类与验证位于单独的模块中,因为验证专门用于我们在应用程序中使用这些模型的方式。这意味着我的一个限制是无论我提出什么设计,都不能涉及更改模型类本身。
我已经尝试了几种设计,但是现在我将模型类与其验证类相关联,方法是将它们作为键值对手动添加到Map
,然后使用工厂返回正确的验证可以使用传入的对象的类型。它可以工作,但不是很优雅,我觉得可能有更好的解决方案。
以下是模型和验证类的设置方式:
// Interface for all validation classes.
public interface Validation<T> {
/**
* Returns all validation for T.
*/
Validator<T> getValidator();
}
// Concrete validation implementation.
public class FooValidation implements Validation<Foo> {
public CompositeValidator<Foo> getValidator(Foo foo) {
// CompositeValidator is a type of Validator that can contain and run many validators.
return CompositeValidator.of(
getFooValidatorA(foo),
getFooValidatorB(foo),
getFooValidatorC(foo)
);
}
public Validator<Foo> getFooValidatorA(Foo foo) {
return new FooValidatorA(foo);
}
public Validator<Foo> getFooValidatorB(Foo foo) {
// Configure and return ValidatorB
}
public Validator<Foo> getFooValidatorC(Foo foo) {
// Configure and return ValidatorC
}
}
// Model class
public class Foo {
public Integer id;
public String name;
public Bar bar;
// etc...
}
简而言之,我希望应用程序以一种简单的方式知道是否需要验证Foo
对象,它应该知道FooValidation
是我需要的验证类。