使用Prism.Forms,哪个IoC容器更好

Mar*_*ins 22 ioc-container inversion-of-control xamarin.forms prism-6

我是在一个新的开始Prism.Forms的项目,我想知道其中的各种的IoC 容器(Autofac,Dryloc,NinjectUnity)将是最好的与前进.

我不知道这是否属实,但我在某处读到Unity已不再处于积极开发状态,因为这MEF是我用过的唯一IoC 容器,我不确定它是否可行.

与此同时,我知道很少或根本不知道Autofac,Dryloc或者Ninject.

请客观地提出任何建议,说明为什么你觉得一个人比其他人好,而不仅仅是"我用xxx "; 我想做出明智的决定.

Dan*_* S. 52

我能做的最好的事情是按照目前的情况来布局事实.

Unity是最受欢迎的容器,因为它是Brian多年来使用的容器,它是模板中第一个(也是很长一段时间)容器.它已经花了很长时间而没有被维护,但是该项目确实有一个新的维护者.值得注意的是,Unity 5中存在许多重大变化,这使得使用Prism 6.3升级到Unity 5是不可能的.然而,Prism已经在Prism 7的所有平台上更新到Unity 5.然而,Unity的基准性能也是平均值.

尽管受欢迎,Autofac仍然是我通常建议不要使用的容器.人们似乎对API非常困惑.在Prism 6.3中,它的实现非常糟糕.Prism 7引入了几个重大变化,并为您提供了PrismApplication使用的ContainerBuilder,解决了很多注册问题.因为Autofac社区坚持要使容器不可变,所以它总是一个我建议不要使用的容器.虽然它适用于基本应用程序,但它会阻止您使用更高级的Prism功能,如Modularity.

Ninject还可以.它肯定是最少使用的容器,从各种容器的基准测试来看,它也是最慢的.Prism 6.3使用了Portable.Ninject,这似乎是一个死的项目.Prism 7.0使用官方的Ninject包.在对v4.0没有更新的13个月后,Ninject终于发布了一个新的netstandard包(v3.3),它将迫使Ninject用户使用netstandard2.0.

DryIoc是我使用和推荐最多的容器.它正在积极开发中,速度非常快,并且与当前版本的Prism配合使用.同样重要的是,当我遇到问题或问题时,维护人员已经很快解决了问题或回答了我的问题.出于所有这些原因,我继续推荐容器.

UPDATE

值得注意的是,从Prism 7的预览5开始,我们已经抽象了容器.这将最终使您更容易在您选择的容器之间切换,因为API在如何注册您的服务和视图方面完全相同.您仍然可以访问Container,如果是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>();
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我一直在寻找的那种反馈.有关Unity可能被删除的观点具有特别重要的意义,但听到Autofac和Ninject可能不是特别好的选择也是有趣的 - 即使它们未来可能会变好.谢谢. (4认同)
  • @HassanTareq,StructureMap 不适用于 Prism.Forms。Autofac 是一个糟糕的容器,我们一直在考虑放弃它。DryIoc 是迄今为止最好用的容器。 (2认同)