Основной веб-интерфейс asp.net FluentValidation с проверкой контроллером - PullRequest
1 голос
/ 20 сентября 2019

Пожалуйста, помогите мне с правильной реализацией проверки item.IDUser через ItemValidator.Текущее решение меня не устраивает, потому что я должен указать статический адрес (например, "http://localhost:49608/"), и невозможно выполнить тестирование через Microsoft.AspNetCore.Mvc.Testing.

public class User
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string User { get; set; }
}

public class UserContext : DbContext
{
    //...
}

public class UserController : ControllerBase
{
    //...
}

public class Item
{
    [Key]
    public int ID { get; set; }
    [Required]
    public int IDUser { get; set; }
}
public class ItemContext : DbContext
{
    //...
}
public class ItemController : ControllerBase
{
    //...
}

public class ItemValidator : AbstractValidator<item>
{
    private readonly HttpClient _client;
    public ItemValidator(IHttpClientFactory httpClientFactory)
    {
        _client = httpClientFactory.CreateClient("userclient");

        RuleFor(r => r.IDUserApplicant).NotNull().GreaterThan(0)
                .MustAsync(CheckUserForExistAsync).WithMessage("Current user not found");
    }

    private async Task<bool> CheckUserForExistAsync(int id, CancellationToken token)
    {
        var response = await _client.GetAsync(string.Format("/api/user/{0}", id), token);
        if (response.IsSuccessStatusCode)
            return true;
        return false;
    }
}

public class Startup
{
    //...
    public void ConfigureServices(IServiceCollection services)
    {
        //...
        services.AddTransient<IValidator<Item>, ItemValidator>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddFluentValidation();
        services.AddHttpClient("userclient", c =>
        {
            c.BaseAddress = new Uri("http://localhost:49608/");
            c.DefaultRequestHeaders.Add("Accept", "application/json");
        });
    }
}
.
...