【问题标题】:Which IoC container is better with Prism.FormsPrism.Forms 哪个 IoC 容器更好
【发布时间】:2017-09-25 15:25:28
【问题描述】:

我正在开始一个新的 Prism.Forms 项目,我想知道各种 IoC 中的哪一个 容器AutofacDrylocNinjectUnity ) 最好继续前进。

我不知道这是否属实,但我在某处读到 Unity 不再处于积极开发中,因为这个和 MEF 是我用过的唯一 IoC 容器我不确定这是否是要走的路。

同时,我对AutofacDrylocNinject 知之甚少。

请在任何建议中保持客观,提供您认为其中一个比其他更好的理由,而不是简单地“我使用 xxx”;我想做出明智的决定。

【问题讨论】:

    标签: xamarin.forms inversion-of-control ioc-container prism-6


    【解决方案1】:

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

    注意:自从我在 2017 年首次回答此问题以来,发生了很大变化。以下信息会持续更新,在您对项目做出决策时应该会有所帮助。但是请注意,您现在还可以使用 Prism.Container.Extensions,因为这为抽象许多强大的注册方法(包括工厂)提供了支持,并且能够将单个实现注册为不同服务的单例。可以在那里添加额外的容器。可以在https://prismplugins.com 找到更多文档

    支持的容器

    这些是 Prism 团队正式发货的容器

    DryIoc

    这是我使用和推荐最多的容器。它正在积极开发中,速度非常快,并且适用于当前版本的 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 或 Common Service Locator 的任何引用,然后更新现在针对 Unity.Container NuGet 包而不是 Unity NuGet 包的 Prism.Unity.Forms。您还应该注意,针对比构建 Prism 的版本更新的 Unity 版本可能会破坏您的应用程序,因为 Unity 引入了许多破坏性更改,而从 Minor Patch 到 Minor Patch 没有解释或文档。

    非官方支持

    这些是提供非官方软件包的容器。这些可能对您有用,也可能对您无效,风险自负。

    Microsoft.Extensions.DependencyInjection

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

    生命周期结束/不推荐使用的容器

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

    Autofac

    尽管很受欢迎,但我通常建议不要使用它。人们似乎对 API 感到很困惑。在 Prism 6.3 中,它的实现非常糟糕。可悲的是,为了提高性能,Autofac 团队非常坚决地决定让容器不可变。自 Prism 7.1 起,Prism 正式放弃了对该容器的支持。

    忍者

    Ninject 长期以来一直是使用率最低的容器之一。随着团队开始支持 netstandard,这在 7.0 中从 Prism.Forms 中删除。虽然 Ninject 3.3 在技术上确实附带了 netstandard2.0 api,但它与 Xamarin 目标不兼容。从 2017 年 11 月发布的最新 3.3 版本和从 2016 年 8 月发布的最新 4.0 预览版,它目前也处于非常不健康的状态。

    更新

    值得注意的是,从 Prism 7 的 Preview 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>();
    }
    

    同样重要的是要记住,虽然 Prism 的 IoC 抽象使拥有更统一的 API 变得更加容易,但这并不会消除您直接与底层 Container 交互的能力。要访问底层容器,您只需调用 GetContainer 扩展方法,您将能够执行 Prism 的 IoC 抽象不直接支持的任何更复杂的操作。

    更新 2

    Prism 7.2 围绕 IoC 抽象引入了一些 API 更改。值得注意的是,这些更改总体上不会影响大多数用户。但是,如果使用引用旧版本 Prism 的其他库,您可能会遇到二进制不兼容问题。

    IoC 的变化包括:

    • 流畅的 API
    • 能够检查服务是否已注册
    • 添加了允许临时服务和单例服务成为命名服务的方法
    • 增加了使用指定实例解析服务的能力。

    【讨论】:

    • 这正是我正在寻找的那种反馈。关于 Unity 可能被放弃的观点具有特别重要的意义,但听到 Autofac 和 Ninject 可能还不是特别好的选择也很有趣——即使它们将来可能会变得很好。谢谢。
    • Unity 似乎还活着:github.com/unitycontainer/unity Ninject 似乎还活着:github.com/ninject/Ninject
    • @Shimmy DryIoc 自 6.3.0-pre2 起可用于 WPF。在 StructureMap 和 Ninject 之间,我可能会选择 StructureMap。您可以在这里查看各种基准测试palmmedia.de/blog/2011/8/30/…
    • @Shimmy 我不认为 DryIoc 存在文档不佳的问题。然而,我会说它功能如此丰富,以至于当试图弄清楚如何进行更复杂的注册时,可能需要一些时间来尝试找到正确的 API。正如您已经注意到的那样,尽管该项目有一个非常敏感的所有者。
    • @HassanTareq,StructureMap 不适用于 Prism.Forms。 Autofac 是一个糟糕的容器,我们一直在考虑放弃它。 DryIoc 是迄今为止最好的容器。
    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2011-09-06
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多