繁体   English   中英

如何在 Xamarin Forms 中实现/注册 singleton HttClientFactory

[英]How to implement / register singleton HttClientFactory in Xamarin Forms

我将 Xamarin Forms 与棱镜一起使用。

如何为 HttpClientFactory 注册服务? xamarin/prism 中是否有与 .net 核心中的 ConfigureServices 方法等效的方法?

我想在 Xamarin forms 中使用此代码的等效项:

    services.AddHttpClient<MyClient>("MyHttpClient",
        x => { x.BaseAddress = new Uri("example.com"); }
        ).AddPolicyHandler(GetRetryPolicy());
    services.AddSingleton<MyClientFactory>();

我一直在尝试不同的方法,但我找不到正确的方法。

非常感谢。

更新

我在一个名为BusinessLogic的网络标准 ClassLibrary 中有这些类

MyClientFactory.cs:

namespace BusinessLogic.Services
{
    public class MyClientFactory
    {
        private readonly IServiceProvider _serviceProvider;

        public MyClientFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public MyClient Create()
        {
            return _serviceProvider.GetRequiredService<MyClient>();
        }
    }
}

我的客户端.cs:

namespace ServiceBusinessLogic.Services
{
    public class MyClient : IMyClient
    {
        private readonly HttpClient _httpClient;
        private readonly ILogger<MyClient> _logger;

        public MyClient(ILogger<MyClient> logger, HttpClient httpClient)
        {
            _logger = logger;
            _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
        }

        public async Task<Result<Token>> GetToken(CancellationToken cancellationToken, string userName, string password)
        {
            try
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "Token");
                request.Content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("grant_type", "password"),
                    new KeyValuePair<string, string>("username", userName),
                    new KeyValuePair<string, string>("password", password)
                });

                HttpResponseMessage result = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
                if (!result.IsSuccessStatusCode)
                {
                    _logger.LogError("the status code is: {0}", (int)result.StatusCode);

// CODE abbreviated for reading

        }

接口 IMyClient.cs:

namespace MyBusinessLogic.Services
{
    public interface IMyClient
    {
        Task<Result<Token>> GetToken(CancellationToken cancellationToken, string userName, string password);
    // CODE abbreviated for reading

MyClientQueries.cs:

namespace MyBusinessLogic.Services
{
    public class MyClientQueries
    {
        private readonly MyClientFactory _myClientFactory;

        public MyClientQueries(MyClientFactory myClientFactory)
        {
            _MyClientFactory = myClientFactory ?? throw new ArgumentNullException(nameof(myClientFactory));

        }

        public async Task<Result<Token>> GetToken(CancellationToken cancellationToken, string username, string password)
        {
            var mysClient = _myClientFactory.Create();
            var response = await tsClient.GetToken(cancellationToken, username, password).ConfigureAwait(true);

            return response;
        }
// CODE abbreviated

然后我有一个名为App_Mobile_test的带有 Prism 的 xamarin forms 项目

App.xaml.cs:

 public partial class App : PrismApplication
    {
         public App() : this(null) { }

        public App(IPlatformInitializer initializer) : base(initializer) { }

        protected override async void OnInitialized()
        {
            InitializeComponent();

            await NavigationService.NavigateAsync("NavigationPage/MainPage");
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<NavigationPage>();
            containerRegistry.RegisterForNavigation<MainPage>();

        }
    }

我想在 Xamarin Forms 项目中使用将 DI 用于HttpClientFactoryHttpClientMyClientQueries作为服务(单例),所以我可以调用 GetToken 和 ZA2F2ED4F8EBC26ABCB1CDD42ED4F8EBC26ABCB1CDD4Z22940ABCB1

但我不知道如何在 Xamarin Forms 中做到这一点。

包含我要使用的 MyClientQueries 的 MyBusinessProject 已在 asp.net 核心 mvc 中使用,并且服务已添加到 .net 核心的 startup.cs 中,如下所示:

public void ConfigureServices(IServiceCollection services)
{
#region "api service"  

            services.AddSingleton<MyClientQueries>();

            services.AddHttpClient<MyClient>("MyHttpClient", 
                x => { x.BaseAddress = new Uri(Configuration["APIConfiguration:BaseAddress"]); }
                ).AddPolicyHandler(GetRetryPolicy());

            services.AddSingleton<MyClientFactory>();

            #endregion
//CODE abbreviated
}

如何注册我在 .net 核心应用程序中执行的相同对象,但在 Xamarin Forms 中并使用视图模型的依赖项注入? 共享项目“MyBusinessLogic”在 asp.net 内核中运行良好,我想在 Xamarin 项目中重用这个项目。 特别是具有 HttpClientFactory 依赖项的 MyClientQueries。

这将取决于您使用的 DI 以及语法将是什么,但通常这种代码将在 App 构造函数或构造函数调用的方法中。

因此,例如,在调用 Xamarin Init() 之后,您的 App.xaml.cs 中可能有一个名为 RegisterServices 的方法,该方法是从构造函数调用的。

在该 RegisterServices 方法中,您将拥有如下内容:

   FreshIOC.Container.Register<IHttpManager, HttpManager>().AsSingleton();

我们使用 FreshMvvm,它使用 TinyIOC 进行依赖注入,所以语法可能不同,但概念是一样的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM