I\'ve read the Microsoft documentation of fundamentals for Options and Configuration, but still can\'t find the right way to extract configuration into an object while validatin
There is still no answer as to how ValidateDataAnnotations work, but based on Nkosi's answer, I wrote this class extension to easily run the validation on-demand. Because it's an extension on Object, I put it into a sub-namespace to only enable it when needed.
namespace Websites.Business.Validation {
///
/// Provides methods to validate objects based on DataAnnotations.
///
public static class ValidationExtensions {
///
/// Validates an object based on its DataAnnotations and throws an exception if the object is not valid.
///
/// The object to validate.
public static T ValidateAndThrow(this T obj) {
Validator.ValidateObject(obj, new ValidationContext(obj), true);
return obj;
}
///
/// Validates an object based on its DataAnnotations and returns a list of validation errors.
///
/// The object to validate.
/// A list of validation errors.
public static ICollection Validate(this T obj) {
var Results = new List();
var Context = new ValidationContext(obj);
if (!Validator.TryValidateObject(obj, Context, Results, true))
return Results;
return null;
}
}
}
Then in Startup it's quite straightforward
EmailConfig EmailSection = Configuration.GetSection("Email").Get().ValidateAndThrow();
services.AddSingleton(EmailSection);
Works like a charm; actually works like I'd expect ValidateDataAnnotations to work.