#c# #.net #wpf #dotnet-httpclient #ihttpclientfactory
#c# #.net #wpf #dotnet-httpclient #ihttpclientfactory
Вопрос:
Я использую MVVM Light для написания приложения WPF, моя первоначальная идея — использовать статический Httpclient для абстрагирования данных с нескольких устройств, существует проблема, связанная с DNS со статическим Httpclient. Итак, если я собираюсь использовать IHttpClientFactory, как мне следует приступить к настройке?
Я прочитал, что для этого потребуется мой конструктор MainViewModel:
public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
///
private readonly IHttpClientFactory httpClientFactory;
public MainViewModel(IHttpClientFactory httpClientFactory)
{
this.httpClientFactory = httpClientFactory;
var client = httpClientFactory.CreateClient();
}
}
У меня здесь 2 проблемы:
а) Я не могу зарегистрировать MainViewModel в ViewLocator
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view services and models
// SimpleIoc.Default.Register<IDataService, DesignDataService>();
}
else
{
/// // Create run time view services and models
//SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<IHttpClientFactory, MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance< MainViewModel>(); --> Error
"ServiceLocator.ActivationException: 'Type not found in cache: "
}
}
б) Требуется ли ниже при запуске и где я должен использовать этот метод?
private void ConfigureServices(IServiceCollection services)
{
// ...
services.AddHttpClient();
services.AddTransient(typeof(MainWindow)); ---> ? valid for MVVM?
}
Или кто-нибудь использовал IHttpClientFactory в WPF с MVVM Light?
Спасибо
Саймон
Ответ №1:
Вы могли бы использовать HostBuilder
в Microsoft.Расширения.Хостинг для создания контейнера DI в ViewModelLocator
:
public class ViewModelLocator
{
private readonly IServiceProvider _serviceProvider;
public ViewModelLocator()
{
_serviceProvider = new HostBuilder()
.ConfigureServices(ConfigureServices)
.Build()
.Services;
}
public MainViewModel Main =>
_serviceProvider.GetService<MainViewModel>();
private void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
services.AddSingleton<MainViewModel>();
}
}