首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MVVM中注册IHttpClientFactory

如何在MVVM中注册IHttpClientFactory
EN

Stack Overflow用户
提问于 2021-02-03 06:00:44
回答 1查看 512关注 0票数 1

我正在使用MVVM编写一个WPF应用程序,我最初的想法是使用静态Httpclient从多个设备抽象数据,存在一个与静态Httpclient有关的DNS问题。那么,如果我要使用IHttpClientFactory,我应该如何设置呢?

我所读到的是我的MainViewModel构造函数需要这样做:

代码语言:javascript
复制
 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();
    }

}

我这里有两个问题:

( a)我无法在MainViewModel上注册ViewLocator

代码语言:javascript
复制
 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: "
        }
    }

( b)启动时是否低于要求,我应该在哪里使用此方法?

代码语言:javascript
复制
 private void ConfigureServices(IServiceCollection services)
    {
        // ...

        services.AddHttpClient();

        services.AddTransient(typeof(MainWindow));  ---> ? valid for MVVM?
    }

或者有人在WPF中使用过IHttpClientFactory和MVVM?

谢谢

西蒙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-03 20:45:45

您可以使用Microsoft.Extensions.Hosting中的Microsoft.Extensions.Hosting创建ViewModelLocator中的DI容器。

代码语言:javascript
复制
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>();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66022060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档