gpt4 book ai didi

xamarin.forms - 用于 Xamarin.Forms 的 Prism 上的 DryIoc 和 IServiceProvider (DryIoc.Microsoft.DependencyInjection)

转载 作者:行者123 更新时间:2023-12-04 12:10:35 31 4
gpt4 key购买 nike

我有一个以 DryIoc 作为容器的 Prism 应用程序。
我要 IHttpClientFactory提供HttpClient s 给我的 输入客户 ,它们是这样的:

public class ExampleService : IExampleService
{
private readonly HttpClient _httpClient;

public RepoService(HttpClient client)
{
_httpClient = client;
}

public async Task<IEnumerable<string>> GetExamplesAsync()
{
// Code deleted for brevity.
}
}

App.xaml.cs 我注册了我的类型化客户端,以便它们可以使用以下内容注入(inject)到 View 模型中:

public partial class App

// ...

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Code deleted for brevity.
containerRegistry.Register<IExampleService, ExampleService>();
}

那是在尝试使用 IHttpClientFactory 之前.

现在,要添加它,我们 should AddHttpClient()IServiceCollection .这就是我想的地方 DryIoc.Microsoft.DependencyInjection 需要,所以,仍然在 App.xaml.cs ,我写了以下内容:

public partial class App

// ...

protected override IContainerExtension CreateContainerExtension()
{
var services = new ServiceCollection();

services.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});

var container = new Container(CreateContainerRules())
.WithDependencyInjectionAdapter(services);

return new DryIocContainerExtension(container);
}

问题是在我的 中示例服务 我收到 客户具有以下规范:

{
"DefaultRequestHeaders":[
],
"BaseAddress":null,
"Timeout":"00:01:40",
"MaxResponseContentBufferSize":2147483647
}

虽然我期待 基地址 成为 https://api.example.com/ ,因此 REST API 调用失败。

使用的正确模式是什么 IServiceProvider何时将 Prism 用于带有 DryIoc 的 Xamarin.Forms?不幸的是,没有关于以下问题的文档或开源代码,我有点迷茫。

谢谢你,祝你有美好的一天。

更新 #1

按种类 Dan S.指导, DryIoc.Microsoft.DependencyInjection 已卸载,因此该项目在尝试使用之前恢复到其状态 IServiceCollection依赖项(在我的情况下, IHttpClientFactory ),然后我安装了 Prism.Forms.Extended及以后 Prism.DryIoc.Extensions .
之后 CreateContainerExtension() App.xaml.cs 变成了:

protected override IContainerExtension CreateContainerExtension()
{
var containerExtension = PrismContainerExtension.Current;
containerExtension.RegisterServices(s =>
{
s.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});
});
return containerExtension;
}

containerRegistry.Register<IExampleService, ExampleService>();已从 中删除注册类型() .

现在 ExampleService终于得到它的 HttpClient注入(inject),一切正常。

更新 #2

唯一与 相关的软件包 Prism 我正在使用的是 Prism.DryIoc.FormsPrism.DryIoc.Extensions .
我完全删除了 的覆盖CreateContainerExtension() App.xaml.cs 并重构 注册类型()

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Code deleted for brevity.
containerRegistry.RegisterServices(s =>
{
s.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});
});
}

这样我就会被抛出 NotImplementedException .
但是,通过覆盖 CreateContainerExtension() 具有以下内容:

protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;  

一切终于恢复正常了!

最佳答案

如果您想使用 IServiceCollection 扩展,例如 AddHttpClient我建议您使用 Prism Container Extensions。在您的情况下,它将是 Prism.DryIoc.Extensions .容器扩展提供了许多额外的支持,包括支持通过服务集合扩展注册服务。

您可以安装 Prism.Forms.Extended 并且一切正常,或者您可以按如下方式更新您的应用程序:

protected override IContainerExtension CreateContainerExtension() =>
PrismContainerExtension.Current;

关于xamarin.forms - 用于 Xamarin.Forms 的 Prism 上的 DryIoc 和 IServiceProvider (DryIoc.Microsoft.DependencyInjection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60078277/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com