Я пытаюсь создать слой проверки, который оборачивает вызовы методов бизнес-логики c в сущностях на уровне домена.
Валидатор должен иметь тот же интерфейс, что и сущность, и предоставлять доступ к состояние, которое содержит объект.
Однако сигнатуры типов методов интерфейса валидатора должны отличаться от сущностей, поскольку валидатор может проверять и преобразовывать входные данные из пользовательского интерфейса (например). Валидатору также необходимо обернуть эти входные вызовы проверки / преобразования и базовый вызов бизнес-логики c в try-перехватах.
Это пример моей текущей реализации:
class Entity {
// state
int _num;
int get num => _num;
// init the state
Entity(this._num = 0)
// business logic methods
void incrementBy(int n) {
// business logic validation
if (n <= 0){
throw Exception('[n] must be greater than 0'); // shouldn't throw raw Exceptions in general
}
// business logic
_num += n;
}
}
class Validator {
// have to hold an instance of the entity
final Entity _entity;
Validator(this._entity);
// have to copy the getters in the entity class
int get num => _entity.num;
// same interface as the Entity, but different type signature
void incrementBy(String n) {
try {
// validate user input
final inc = ConvertToInt(n); // -> could throw a FormatException
// call the underlying busines logic
_entity.incrementBy(inc); // -> could throw an Exception
} on Exception catch (e) { // shouldn't catch raw Exceptions in general
...
}
}
Is Есть ли лучший способ обернуть сущность?
Чувствовать себя очень неуклюже, как показано выше, потому что не существует принудительного применения того, какие методы необходимо переопределить, как в случае implementing
сущности , что вы не можете сделать, так как подписи типов должны быть одинаковыми.
Что-то вроде class Validator hides Entity{...}
было бы здорово. Это будет что-то вроде комбинации extends
, вам не нужно будет содержать экземпляр сущности или переопределения методов получения, и implements
, поскольку вы будете вынуждены переопределить все методы интерфейса.