Prism.Autofac.Forms 实施

Prism.Autofac.Forms Impelementation

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

这两个应用程序都在工作,但我有一个 PCL,我在其中使用编译器语句来使用 Prism.Autofac 或 Prism.Unity。根据情况选择表格。

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

例如,对于 Unity,我正在这样做:

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

但是对于 Autofac,"RegisterInstance" 方法不存在。我尝试了很多方法来实现这一点,我发现 ContainerBuilder class 有那个方法,但是如果我这样做:

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

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

所以,我的问题是:如何仅将 RegisterInstance 和 RegisterType 方法用于 PRISM 容器(没有 ContainerBuilder 实例)?如果不可能,我必须创建一个 ContainerBuilder 实例,PRISM Container 如何 "register" 我的自定义类型?

提前致谢

用于 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 的基础应用程序 class 的实现已更新以考虑到这一点,并为您提供一个 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

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

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

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);
    }
}