从验证器类记录日志

jim*_*own 3 c# validation asp.net-web-api .net-core asp.net-core

我在 Web API 中使用了一个简单的类,如下所示。正如您所看到的,它有一个通过属性应用的验证器

[CustomerNameValidator]
public class Customer
{
    public string CustomerName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

验证器类如下所示

public class CustomerNameValidatorAttribute : ValidationAttribute
{

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Customer customer = (Customer)validationContext.ObjectInstance;

        if ( string.IsNullOrEmpty(customer.CustomerName))
        {
            return new ValidationResult("Invalid customer Name");
        }


        return ValidationResult.Success;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在 IsValid 方法中添加一些日志记录。我正在使用 Startup 类设置的其他地方使用日志记录,如下所示。

public Startup(IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();


    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    loggerFactory.AddNLog();
}
Run Code Online (Sandbox Code Playgroud)

如何在验证属性类中使用记录器?

Hen*_*ema 6

ValidationContext用(实例)属性填充。这意味着您可以使用上的方法从中解析服务。RequestServicesHttpContextIServiceProviderGetServiceValidationContext

例如:

var logger = (ILogger<CustomerNameValidatorAttribute>)validationContext.GetService(typeof(ILogger<CustomerNameValidatorAttribute>));
Run Code Online (Sandbox Code Playgroud)