В настоящее время я пытаюсь удалить всю бизнес-логику из наших классов модели базы данных, чтобы они не содержали ничего, кроме полей, методов получения и установки. Сейчас я немного застрял в том, как извлечь валидацию.
Наша проверка довольно сложна, и каждая модель настраивает и запускает каждый из своих валидаторов самостоятельно, когда вызывается 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
- это класс проверки, который мне нужен.