我正在开发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如何“注册”我的自定义类型?
提前致谢
答案 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);
}
}