Prism.Autofac.Forms Impelementation

时间:2017-01-25 14:53:35

标签: c# xamarin.forms prism autofac

我正在开发2个应用程序。其中一个在WPF中使用Prism.Autofac,另一个在Xamarin Forms中使用Prism.Unity开发。

这两个应用程序都正常运行,但我有一个PCL,我根据案例使用编译器句子来使用Prism.Autofac或Prism.Unity.Forms。

我正在尝试在两个应用程序中实现Autofac,但我不知道如何在Xamarin.Forms上注册类型。

例如,使用Unity,我正在这样做:

Container.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>()); 

但是使用Autofac的“RegisterInstance”方法它不存在。我正在尝试很多方法来实现这一点,我发现ContainerBuilder类有这个方法,但如果我这样做:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>());

使用ContainerBuilder实例,PRISM Container无法像注册实例那样识别我的自定义类/服务,因此无法创建ViewModel的构造函数。

所以,我的问题是:如何只使用RegisterInstance和RegisterType方法与PRISM Container(没有ContainerBuilder实例)?如果不可能,我必须创建一个ContainerBuilder实例,PRISM Container如何“注册”我的自定义类型?

提前致谢

2 个答案:

答案 0 :(得分:2)

Prism Forms的Autofac一直存在巨大问题。为了使用Prism.Autofac.Forms在v6.X中注册类型,你可以使用类似的代码:

public class App : PrismApplication
{
    protected override void RegisterTypes()
    {
        var builder = new ContainerBuilder();
        Container.RegisterTypeForNavigation<MainPage>()
        builder.RegisterType<MyService>().As<IMyService>();
        builder.Update( Container );
    }
}

从v7.0开始,这已经更新。请注意,由于以下评论之一表明Autofac已弃用builder.Update,因为Autofac社区希望使容器不可变。对于希望利用Prism模块化的Prism应用程序来说,这通常是一个糟糕的选择。使用Prism 7,Autofac的基础应用程序类的实现已经更新,以考虑到这一点,并为您提供单个ContainerBuilder,用于Prism的基本注册以及您的任何特定类型在共享代码和您的IPlatformInitializer。请记住,在达到OnInitialized之前,Container实际上并未构建和可用。更新后的注册将如下所示:

public class App : PrismApplication
{
    protected override void RegisterTypes()
    {
        Builder.RegisterTypeForNavigation<MainPage>()
        Builder.RegisterType<MyService>().As<IMyService>();
    }
}

您可以在此处阅读v7更改:

https://dansiegel.net/post/2017/08/02/breaking-changes-for-prism-autofac-users

答案 1 :(得分:0)

更新现在已经过时,对我来说最好的方法是创建一个模块,看看:

首先在项目中创建一个模块:

public  class ExampleModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<LoginP>().As<ILoginP>().InstancePerDependency();
        base.Load(builder);
    }
}

在您的表示层中,包含模块示例(xamarin.Android mainActivity.cs):

public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainer container)
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule<ExampleModule>();
        builder.Update(container);
    }
}