簡體   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