In this example, date is a member parameter of the Birthday ValueObject, as it holds the actual value (the date of the birthday).
Dependency Parameters
On the other hand, "dependency parameters" are used for dependency injection within your modddel. For example, the Birthday ValueObject might rely on a currentTimeService for validation. To achieve this, you can annotate the currentTimeService parameter with @dependencyParam:
@Modddel(
validationSteps: [
ValidationStep(
[Validation('age', FailureType<BirthdayAgeFailure>())],
name: 'Value',
),
]
)
class Birthday extends SingleValueObject<InvalidBirthday, ValidBirthday>
with _$Birthday {
Birthday._();
factory Birthday({
required DateTime date,
// (A)
@dependencyParam required ICurrentTimeService currentTimeService,
}) {
return _$Birthday._create(
date: date,
currentTimeService: currentTimeService,
);
}
@override
Option<BirthdayAgeFailure> validateAge(birthday) {
// (B)
final service = birthday.currentTimeService;
final age = service.getAge(birthday.date);
if (age < 13) {
return some(const BirthdayAgeFailure.tooYoung());
}
return none();
}
}
@freezed
class BirthdayAgeFailure extends ValueFailure with _$BirthdayAgeFailure {
const factory BirthdayAgeFailure.tooYoung() = _TooYoung;
}
@override
Option<BirthdayAgeFailure> validateAge(birthday) {
final service = birthday.currentTimeService;
// ...
}
final birthday = Birthday(
date: DateTime(1995, 8, 20),
currentTimeService: currentTimeService,
);
final service = birthday.currentTimeService;
@override
Option<BirthdayAgeFailure> validateAge(birthday) {
// Bad, will throw a runtime error.
final service = this.currentTimeService;
// Good
final service = birthday.currentTimeService;
}