C# Prism.Autofac.Forms推进

C# Prism.Autofac.Forms推进,c#,xamarin.forms,prism,autofac,C#,Xamarin.forms,Prism,Autofac,我正在开发两个应用程序。其中一个是在WPF中使用Prism.Autofac,另一个是在Xamarin形式中使用Prism.Unity开发的 这两个应用程序都在工作,但我有一个PCL,根据具体情况,我使用编译器语句来使用Prism.Autofac或Prism.Unity.Forms 我试图在这两个应用程序中实现Autofac,但我不知道如何在Xamarin.Forms上注册类型 例如,在Unity中,我正在这样做: Container.RegisterInstance(Xamarin.Forms.

我正在开发两个应用程序。其中一个是在WPF中使用Prism.Autofac,另一个是在Xamarin形式中使用Prism.Unity开发的

这两个应用程序都在工作,但我有一个PCL,根据具体情况,我使用编译器语句来使用Prism.Autofac或Prism.Unity.Forms

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

例如,在Unity中,我正在这样做:

Container.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>()); 
Container.RegisterInstance(Xamarin.Forms.DependencyService.Get());
但对于Autofac,“RegisterInstance”方法,它并不存在。我尝试了许多方法来实现这一点,我发现ContainerBuilder类具有该方法,但如果我这样做:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>());
ContainerBuilder=newcontainerbuilder();
RegisterInstance(Xamarin.Forms.DependencyService.Get());
使用ContainerBuilder实例时,PRISM容器无法像注册实例那样识别自定义类/服务,因此无法创建ViewModel的构造函数

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


提前感谢Autofac为Prism Forms提供的帮助,这是一个巨大的问题。为了在v6.X中使用Prism.Autofac.Forms注册类型,您需要编写如下代码:

public class App : PrismApplication
{
    protected override void RegisterTypes()
    {
        var builder = new ContainerBuilder();
        Container.RegisterTypeForNavigation<MainPage>()
        builder.RegisterType<MyService>().As<IMyService>();
        builder.Update( Container );
    }
}
您可以在此处了解v7的更改:


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

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

public  class ExampleModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<LoginP>().As<ILoginP>().InstancePerDependency();
        base.Load(builder);
    }
}
公共类示例模块:模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
builder.RegisterType().As().InstancePerDependence();
基础荷载(建筑商);
}
}
在表示层中,包括模块示例(xamarin.Android mainActivity.cs):

公共类AndroidInitializer:IPlatformInitializer
{
公共无效注册表类型(IContainer容器)
{
var builder=new ContainerBuilder();
builder.RegisterModule();
生成器更新(容器);
}
}

是的,这是我的评论。ContainerBuilder类有这些方法,但如何将它们用于PRISM正在使用的容器?您询问了如何执行这些方法。这些文件展示了一些例子。如果你看到了一个错误或者其他东西不起作用,你的问题就不清楚了。“无法识别对象”没有任何意义。有例外吗?什么东西是空的?需要更多信息。好吧,这个问题清楚吗??如何仅使用PRISM容器(不使用create ContainerBuilder实例)使用RegisterInstance和RegisterType方法?如果这是不可能的,我必须使用ContainerBuilder类,它将如何“看到”这些对象??我已经创建了一个ContainerBuilder实例,但是当我使用NavigationService.NavigateAsync时,viewmodel的构造函数无法识别注册的类型,因此无法创建构造函数。最好更新问题的主体,以便每个人都能看到澄清。不清楚你所说的“不被认可”是什么意思。我讨厌迂腐,但这是一个工程主题,所以清晰和精确很重要。这正是我需要的。我不知道如何更新容器,即使它可以被更新。感谢您的帮助。在Prism Form 6.3随附的版本中,更新现在已过时。这实际上并不反映在Prism 6或Prism 7中处理注册的正确方式。请参阅有关如何正确处理注册的更新信息。此示例在prism 6中:
public  class ExampleModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<LoginP>().As<ILoginP>().InstancePerDependency();
        base.Load(builder);
    }
}
public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainer container)
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule<ExampleModule>();
        builder.Update(container);
    }
}