java - 将数据库模型类与其验证相关联的模式
问题描述
我目前正在尝试从我们的数据库模型类中删除所有业务逻辑,以便它们只包含字段、getter 和 setter。现在我有点纠结于如何提取验证。
我们的验证相当复杂,每个模型在isValid()
被调用时都会自行配置和运行每个验证器。我已经将每个模型的验证提取到它自己的参数化验证类中,其中参数是它验证的对象的类型。
我很难解决的问题是想出一种将模型类与其验证类相关联的简单方法。模型类与验证位于单独的模块中,因为验证专门针对我们如何在应用程序中使用这些模型。这意味着我的一个限制是,无论我想出什么设计,都不能涉及更改模型类本身。
我已经尝试了几种设计,但是现在我将模型类与其验证类相关联,方法是手动将它们作为键值对添加到 a 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
是我需要的验证类。
解决方案
推荐阅读
- ruby-on-rails - 在 Ruby 中将 DOCX 文件转换为 PDF 文件
- laravel - Laravel 关系(一对多)
- javascript - Sharepoint 和 Microsoft Teams 无法在 HTML 文件查看器中预览 HTML 文件
- r - Hugo Academic 删除网站图标
- javascript - 如何在 ReactJS 的函数中声明全局变量?
- python - 如何从包含日期和其他单词的列中获取日期?
- php - 通过 Junction Table yii2 的相关模型
- codenameone - 使用 Object-C 本机接口时的代号一“内存不足”(HEIC 到 JPEG 转换)
- google-bigquery - 更改现有 bigquery 表中的聚集列
- html - 如何单独设置标题并将图片放在两侧并添加社交媒体图标并将其居中