在Prism中,在构造函数之前调用RegisterTypes

时间:2018-06-29 17:15:22

标签: c# xamarin xamarin.forms prism

MainActivity.csAppDelegate.cs中,我像这样初始化Configuration对象:

LoadApplication(new App(Configuration.GetConfiguration, new AndroidInitializer()));

我将该对象插入App类的构造函数中。

我想在RegisterTypes方法中注册相同的对象。

public partial class App : PrismApplication
{
    public App(IConfiguration configuration, IPlatformInitializer initializer = null) : base(initializer)
    {
        Configuration = configuration;
    }

    private IConfiguration Configuration { get; }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // Here Configuration is null.
        containerRegistry.RegisterInstance<IConfiguration>(Configuration);

        // Need to access configuration again.
        var restClient = new RestClient(Configuration.BaseApiUrl);
        containerRegistry.RegisterInstance<IRestClient>(restClient);
    }
}

RegisterTypes方法中,Configuration为null,因为它是在构造方法之前调用的。

有任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

有两种方法可以完成所需的工作,具体取决于您要使用IConfiguration完成的工作:

如果您要做的只是注册IConfiguration的实例,那么您应该在IPlatformInitializer中注册它,而不是在您的应用程序中注册。例如,您可能有:

public class iOSInitializer : IPlatformInitalizer
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistery.RegisterInstance<IConfiguration>(new iOSConfiguration());
    }
}

如果您需要专门访问IConfiguration,并且可以遵循第一种模式并解决它即可完成您需要做的事情...否则,您可以执行以下操作:

public class iOSInitializer : IPlatformInitalizer, IConfiguration
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistery.RegisterInstance<IConfiguration>(this);
    }
}

然后在您的应用中,您只需执行以下操作即可:

var configuration = (IConfiguration)PlatformInitializer