问题描述
我将 Xamarin Forms 与 Prism 结合使用。
如何为 HttpClientFactory 注册服务? xamarin/prism 中是否有与 .net 核心中的 ConfigureServices 方法等效的方法?
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
的带有 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 用于 HttpClientFactory 和 HttpClient 作为服务(单例),所以我可以调用 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 进行依赖注入,因此语法可能有所不同,但概念是相同的。