Validation and metadata
Validation
public interface IAlbumEdit : IRuntimeTrackingItem<Album>
{
string Title { get; set; }
}
RuntimeTrackingOptions<Album> options = RuntimeTracking.CreateOptions<Album, IAlbumEdit>();
options.Validate<Album, IAlbumEdit>(static edit => !string.IsNullOrWhiteSpace(edit.Title));
IAlbumEdit edit = options.GetRegistration<IAlbumEdit>().Create(original);
bool valid = ((IValidatable)edit).Validate();
Validation with caller context
options.Validate<Album, IAlbumEdit, HashSet<string>>(
static (edit, reservedTitles) => !reservedTitles.Contains(edit.Title));
IValidatable<HashSet<string>> validatable = (IValidatable<HashSet<string>>)edit;
bool valid = validatable.Validate(reservedTitles);
The context type is supplied by application code at validation time.
Async validation
options.ValidateAsync<Album, IAlbumEdit>(
static (edit, cancellationToken) => ValueTask.FromResult(!string.IsNullOrWhiteSpace(edit.Title)));
IAsyncValidatable validatable = (IAsyncValidatable)edit;
bool valid = await validatable.ValidateAsync(cancellationToken);
Async validation with context
options.ValidateAsync<Album, IAlbumEdit, HashSet<string>>(
static (edit, reservedTitles, cancellationToken) => ValueTask.FromResult(!reservedTitles.Contains(edit.Title)));
IAsyncValidatable<HashSet<string>> validatable = (IAsyncValidatable<HashSet<string>>)edit;
bool valid = await validatable.ValidateAsync(reservedTitles, cancellationToken);
The context object is supplied by the caller.
Metadata
RuntimeTrackingOptions<Album> options = RuntimeTracking.CreateOptions<Album>();
options.Metadata<Album, string[]>();
IRuntimeTrackingItem<Album> edit = options.GetRegistration<IRuntimeTrackingItem<Album>>().Create(original);
((IMetadataWriter<string[]>)edit).SetMetadata(["Title is required"]);
string[] messages = ((IMetadataReader<string[]>)edit).Metadata;
Reader and writer support can be configured separately.
options.Metadata<Album, string[]>(reader: true, writer: false);
The metadata type and its meaning belong to application code.