Шаблон для связи классов модели базы данных с их проверкой - PullRequest
2 голосов
/ 29 марта 2019

В настоящее время я пытаюсь удалить всю бизнес-логику из наших классов модели базы данных, чтобы они не содержали ничего, кроме полей, методов получения и установки. Сейчас я немного застрял в том, как извлечь валидацию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...