我正在重写我的香草Xamarin应用程序以使用Prism库。
当前的应用程序使用Azure ADB2C使用此框架进行授权。
Android需要设置其父窗口,这是通过将以下代码添加到Android项目的MainActivity.cs中来实现的:
var authenticationService = DependencyService.Get<IAuthenticationService>();
authenticationService.SetParent(this);
这不适用于Prism应用,authenticationService为null。作为记录,此处使用的DependencyService是Xamarin.Forms.DependencyService。
我还尝试了Prism文档中的示例,并将此代码放入AndroidInitializer中:
public void RegisterTypes(IContainerRegistry container)
{
// Register any platform specific implementations
container.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>("B2CAuthenticationService");
var authService = Container.Resolve<IAuthenticationService>();
authService.SetParent(this);
}
在此代码中,容器(DryIoC容器)没有为Resolve定义。
为了完整起见,这是我的App.cs RegisterTypes:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>();
...
...
}
您在这里做出一些错误的假设。首先,您会注意到IContainerRegistry特别具有名称Registry,这意味着我们不希望您在此处解析类型。这就是为什么您没有看到Resolve方法,而是看到IContainerProvider实例的原因。
通过设计,Prism不再直接与Xamarin.Forms DependencyService一起使用,因为这是一个完整的反模式。也就是说,如果您遵循有关注册平台特定类型的指导,则可以看到如何使用IPlatformInitializer注册平台特定类型。重要的是要在这里意识到在PrismApplication中调用RegisterTypes之前先调用IPlatformInitializer。
我建议建议引入一个IParentWindowProvider,例如:
public interface IParentWindowProvider
{
object Parent { get; }
}
然后,您可以在Android上实现此功能,例如:
public class MainActivity : IPlatformInitializer, IParentWindowProvider
{
object IParentWindowProvider.Parent => this;
void IPlatformInitializer.RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance<IParentWindowProvider>(this);
}
}
然后,在您的应用程序中,您可以执行以下操作:
protected override void OnInitialized()
{
if(Container.IsRegistered<IParentWindowProvider>())
{
var provider = Container.Resolve<IParentWindowProvider>();
var authService = Container.Resolve<IAuthenticationService>();
authService.SetParent(provider.Parent);
}
}
有关更多信息,请务必查看相关文档和样本
https://prismlibrary.com/docs/xamarin-forms/dependency-injection/platform-specific-services.html https://github.com/PrismLibrary/Prism-Samples-Forms/tree/master/03-PlatformSpecificServices
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。