Xamarin.forms 哪个IoC容器更适合使用Prism.Forms

Xamarin.forms 哪个IoC容器更适合使用Prism.Forms,xamarin.forms,inversion-of-control,ioc-container,prism-6,Xamarin.forms,Inversion Of Control,Ioc Container,Prism 6,我正处于一个新的Prism.Forms项目的开始阶段,我想知道各种IoC容器(Autofac、Dryloc、Ninject或Unity)中的哪一个最适合向前推进 我不知道这是不是真的,但我在某个地方读到Unity不再处于积极开发中,因为这和MEF是我唯一使用过的IoC容器,我不确定这是否是一条路 同时,我对Autofac、Dryloc或Ninject知之甚少或一无所知 请客观地给出任何建议,提供您认为其中一个优于其他建议的原因,而不仅仅是“我使用xxx”;我想做出一个明智的决定。我能做的最好的事

我正处于一个新的
Prism.Forms
项目的开始阶段,我想知道各种
IoC
容器(
Autofac
Dryloc
Ninject
Unity
)中的哪一个最适合向前推进

我不知道这是不是真的,但我在某个地方读到Unity不再处于积极开发中,因为这和
MEF
是我唯一使用过的
IoC
容器,我不确定这是否是一条路

同时,我对
Autofac
Dryloc
Ninject
知之甚少或一无所知


请客观地给出任何建议,提供您认为其中一个优于其他建议的原因,而不仅仅是“我使用xxx”;我想做出一个明智的决定。

我能做的最好的事情就是按照事实的现状来安排

注意:自2017年我第一次回答这个问题以来,发生了很大变化。下面的信息将继续更新,并将帮助您对项目做出决策。但是请注意,您现在也可以使用Prism.Container.Extensions,因为它支持抽象许多功能强大的注册方法,包括工厂,并且可以将单个实现注册为不同服务的单例。可以在那里添加额外的容器。有关这方面的其他文档,请访问

支撑容器 这些是Prism团队正式运送的集装箱

德赖奥 这是我使用和推荐最多的容器。它正在积极开发中,速度非常快,与当前版本的Prism配合良好。同样重要的是,当我遇到问题时,维护人员会非常迅速地解决问题或回答我的问题。Dadhi还非常擅长主动为Prism集成提供增强功能。出于所有这些原因,我继续推荐容器。与Unity不同,API趋向于非常稳定,我还没有遇到更新DryIoc的问题,超出Prism特定版本的目标

统一容器 不要与Unity游戏开发平台混淆。这是最受欢迎的容器,因为它是Brian多年来使用的容器,也是模板中第一个可用的容器(也是很长一段时间以来唯一可用的容器)。它已经有一段时间没有被维护了,但是这个项目确实有了一个新的维护者。值得注意的是,Unity 5中有许多突破性的变化,这使得使用Prism 6.3升级到Unity 5成为不可能。然而,Prism已在Prism 7的所有平台上更新为Unity 5。Unity在其基准性能方面也处于中等水平。对于从Prism 6.X升级到Prism 7的用户,请注意,您应该卸载对Unity或公共服务定位器的任何引用,然后更新Prism.Unity.Forms,它现在的目标是Unity.Container NuGet包,而不是Unity NuGet包。您还应该注意,针对比Prism所针对的更新版本的Unity,可能会破坏您的应用程序,因为Unity在不同的小补丁之间引入了许多突破性的更改,没有解释或文档

非正式支持 这些集装箱都有非官方的包装。这些可能对您有效,也可能无效,风险由您自行承担

Microsoft.Extensions.DependencyInjection Prism需要某些特性,例如Microsoft DependencyInjection模式不支持的可变性和命名服务。但是,有一个实现为Prism.Container.Extensions项目中的所有Prism应用程序/平台提供了通用支持

报废/弃用容器 虽然这些容器多年来已在许多项目中使用,但Prism团队不再支持以下容器

自动传真 尽管它很受欢迎,但我还是建议不要使用它。人们似乎对API非常困惑。在Prism 6.3中,它的实现非常糟糕。不幸的是,Autofac团队非常坚决地决定,为了提高性能,他们将使容器不可变。从Prism 7.1开始,Prism正式放弃了对此容器的支持

尼尼特 Ninject是使用率最低的容器之一。当团队转向支持netstandard时,7.0中的Prism.Forms中删除了此项。虽然Ninject 3.3在技术上提供了netstandard2.0API,但它与Xamarin目标不兼容。它目前也处于非常不健康的状态,从2017年11月开始发布最新的3.3版本,从2016年8月开始发布最新的4.0预览版

更新 值得注意的是,从Prism 7的预览5开始,我们已经抽象了容器。这最终将使在您选择的容器之间切换变得更加容易,因为API在如何注册服务和视图方面完全相同。您仍然可以通过扩展方法访问容器,如果是Autofac,还可以访问ContainerBuilder,这样您就可以完成更复杂的注册

// Prism 6.X way of Registering Services
protected override void RegisterTypes()
{
    // Container Specific Registrations

    // Autofac
    Builder.RegisterType<DebugLogger>().As<ILoggerFacade>().SingleInstance();

    // DryIoc
    Container.Register<ILoggerFacade, DebugLogger>(reuse: Reuse.Singleton,
                                                   ifAlreadyRegistered: IfAlreadyRegistered.Replace);

    // Ninject
    Container.Bind<ILoggerFacade>().To<DebugLogger>().InSingletonScope();

    // Unity
    Container.RegisterType<ILoggerFacade, MCAnalyticsLogger>(new ContainerControlledLifetimeManager());
}

// Unified API in Prism 7
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<ILoggerFacade, DebugLogger>();
}
//Prism 6.X注册服务的方式
受保护的覆盖无效注册表类型()
{
//特定集装箱登记
//自动传真
Builder.RegisterType().As().SingleInstance();
//德赖奥
容器.Register(重用:重用.Singleton,
ifAlreadyRegistered:ifAlreadyRegistered.Replace);
//尼尼特
Container.Bind().To().InSingletonScope();
//统一
RegisterType(新的ContainerControlledLifetimeManager());
}
//Prism 7中的统一API
受保护的覆盖无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton();
}
记住这一点也很重要