Пожалуйста, помогите мне с правильной реализацией проверки 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");
});
}
}
.