微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 Xamarin Forms 中实现/注册单例 HttClientFactory

我将 Xamarin Forms 与 Prism 结合使用。

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

我想在 Xamarin 表单中使用与此代码等效的代码

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

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),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 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 表单项目

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

        }
    }

我想使用 MyClientQueries,它在 Xamarin Forms 项目中将 DI 用于 HttpClientFactoryHttpClient 作为服务(单例),所以我可以调用 GetToken 和该类中的所有其他方法

但我不知道如何在 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 Core 应用程序中执行但在 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 进行依赖注入,因此语法可能有所不同,但概念是相同的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。