Как зарегистрировать IHttpClientFactory в MVVM Ligtht MainViewModel

#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>();
    }
}