我正在开发两个应用程序。其中一个是在WPF中使用Prism.Autofac,另一个是用Prism.Unity以Xamarin形式开发的。
这两个应用程序都可以工作,但我有一个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不能像注册实例那样识别我的自定义类/服务,因此无法创建视图模型的构造函数。
因此,我的问题是:如何才能将RegisterInstance和RegisterType方法仅用于PRISM Container (没有ContainerBuilder实例)?如果这是不可能的,我必须创建一个ContainerBuilder的实例,PRISM容器如何“注册”我的自定义类型?
提前感谢
发布于 2017-01-26 01:52:18
Autofac for 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.0开始,这一点已经更新。注意,正如下面的评论之一指出的那样,Autofac已经弃用了builder.Update
,因为Autofac社区希望使容器不可变。这使得它对于想要利用棱镜的模块化的棱镜应用程序来说是一个糟糕的选择。在Prism 7中,Autofac的基本应用程序类的实现已经进行了更新,以考虑到这一点,并为您提供了单个ContainerBuilder,用于Prism的基本注册以及共享代码和IPlatformInitializer
中的任何特定类型。请记住,在到达OnInitialized
之前,容器并不是实际构建和可用的。更新后的注册将如下所示:
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
发布于 2017-10-20 11:18:07
更新现在已经过时了,对我来说最好的方法是创建一个模块,看:
首先在你的项目中创建一个模块:
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);
}
}
https://stackoverflow.com/questions/41854643
复制