یک نکتهی تکمیلی: امکان اعتبارسنجی تنظیمات برنامه در ASP.NET Core 2.2
فرض کنید، چنین تنظیماتی را تدارک دیدهاید:
در ASP.NET Core 2.2 میتوان با استفاده از data annotations، برای کلاس معادل آنها اعتبارسنجی نیز درنظر گرفت:
سپس برای فعالسازی آن میتوان به صورت زیر عمل کرد:
کار اعتبارسنجی خاصیت Setting1 زمانی رخ میدهد که برنامه برای اولین بار میخواهد از مقدار آن استفاده کند؛ نه زمانیکه برنامه برای اولین بار اجرا میشود. قابلیت eager validation احتمالا به نگارشهای بعدی اضافه خواهد شد. اگر اعتبارسنجی تنظیمات با شکست مواجه شود، استثنای OptionsValidationException را صادر میکند. این استثناء به همراه لیستی از خطاهای ممکن، توسط خاصیت ex.Failures آن قابل بررسی است.
همچنین اگر نیاز به تعریف اعتبارسنجی سفارشی نیز وجود داشت میتوان به صورت زیر عمل کرد:
فرض کنید، چنین تنظیماتی را تدارک دیدهاید:
"CustomConfig": { "Setting1": "Hello", "Setting2": "Hello" }
public class CustomConfig { [Required(ErrorMessage = "Custom Error Message")] public string Setting1 { get; set; } public string Setting2 { get; set; } public string Setting3 { get; set; } }
namespace MvcTest { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddOptions<CustomConfig>() .Bind(Configuration.GetSection("CustomConfig")) .ValidateDataAnnotations(); }
همچنین اگر نیاز به تعریف اعتبارسنجی سفارشی نیز وجود داشت میتوان به صورت زیر عمل کرد:
namespace MvcHealthCheckTest { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddOptions<CustomConfig>() .Bind(Configuration.GetSection("CustomConfig")) .ValidateDataAnnotations() .Validate(customConfig => { if (customConfig.Setting2 != default) { return customConfig.Setting3 != default; } return true; }, "Setting 3 is required when Setting2 is present"); }
در اینجا متد Validate، شیء customConfig را از تنظیمات برنامه خوانده و مقدار دهی میکند. سپس آنرا به صورت یک <Func<CustomConfig, bool جهت اعتبارسنجی سفارشی در اختیار مصرف کننده قرار میدهد. خروجی false آن به معنای شکست اعتبارسنجی است. در این حالت میتوان توسط پارامتر دوم متد Validate، یک پیام خطا را نیز نمایش داد.