首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prism.Autofac.Forms实现

Prism.Autofac.Forms实现
EN

Stack Overflow用户
提问于 2017-01-25 14:53:35
回答 2查看 2.3K关注 0票数 2

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

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

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

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

代码语言:javascript
运行
AI代码解释
复制
Container.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>()); 

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

代码语言:javascript
运行
AI代码解释
复制
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterInstance(Xamarin.Forms.DependencyService.Get<SomeService>());

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

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

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 01:52:18

Autofac for Prism Forms有很大的问题。为了将v6.X中的类型注册到Prism.Autofac.Forms,你需要编写类似这样的代码:

代码语言:javascript
运行
AI代码解释
复制
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 7中,Autofac的基本应用程序类的实现已经进行了更新,以考虑到这一点,并为您提供了单个ContainerBuilder,用于Prism的基本注册以及共享代码和IPlatformInitializer中的任何特定类型。请记住,在到达OnInitialized之前,容器并不是实际构建和可用的。更新后的注册将如下所示:

代码语言:javascript
运行
AI代码解释
复制
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

票数 2
EN

Stack Overflow用户

发布于 2017-10-20 11:18:07

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

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

代码语言:javascript
运行
AI代码解释
复制
public  class ExampleModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<LoginP>().As<ILoginP>().InstancePerDependency();
        base.Load(builder);
    }
}

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

代码语言:javascript
运行
AI代码解释
复制
public class AndroidInitializer : IPlatformInitializer
{
    public void RegisterTypes(IContainer container)
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule<ExampleModule>();
        builder.Update(container);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41854643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档