iOS推荐的IoC框架是什么?

24

有没有人可以推荐一个好的IoC框架,以便于在iOS上进行依赖注入?

到目前为止我只发现了一个叫做Objection Framework的框架,它似乎类似于Guice(可惜我对Guice并不熟悉)。这个框架是否是在iOS上常用的选择?是否还有其他值得尝试的竞争框架?


把它作为一个答案。我认为我的回答是及时的信息,所以随时可以在将来更多框架可用时更改接受。 - Merlyn Morgan-Graham
3个回答

21

台风

台风-网站列出了主要特点。以下是一个快速的概述:

  • 非侵入式。不需要宏或XML。使用Objective-C或Swift API进行配置,利用Objective-C运行时的优势。

  • 轻量级。只有2500行代码。占用空间非常小,适用于CPU和内存受限的设备。经过性能调整。

  • 使得拥有同一基类或协议的多个配置变得容易。

  • 没有魔法字符串 - 支持IDE重构、代码补全和编译时检查。

  • 支持视图控制器的注入和故事板集成。

  • 支持初始化程序和属性注入,以及生命周期管理。

  • 强大的内存管理功能。提供预配置对象,没有单例的内存开销。

  • 对循环依赖关系的支持非常好。

  • 经过实战检验 - 用于各种Appstore特色应用程序。

  • 一个国际分布的核心团队(我们甚至监视StackOverflow),因此对于您的任何问题的支持永远不会太远 :)

API文档和示例应用


3
唯一具备真正理解DI的选择。谢谢Jasper! - Alexander Smirnov
1
@Jasper Blues 我研究了这个和其他依赖注入框架。即使在阅读文档后,我仍然不太明白使用它与手动操作相比的好处。使用这种或任何框架似乎都很笨重,并且不是没有代价的。你能给些建议吗? - Boon
我正在研究台风。我很惊讶地发现,在完全实现的应用程序和低级API文档之间找不到任何东西。尽管这个项目似乎是最先进的,但在我看来存在明显的缺陷。 - AsTeR
1
@aryaxt 这是一个依赖注入容器。内部模仿了Spring(后处理器等)。当从一个顶级对象图(比如视图控制器)跳转到另一个时,我们向容器请求实例。不要将其与服务定位器混淆,所有的依赖注入容器都会这样做。Martin Fowler撰写了一篇很好的文章,他帮助创造了“依赖注入”这个术语,并在这篇文章中将其与“服务定位器”进行了对比。虽然有点老,但还是很经典:http://martinfowler.com/articles/injection.html - Jasper Blues
2
@aryaxt 请注意,当从一个对象图转到另一个对象图时,提供实例的工厂本身被注入,并且可以由协议支持。因此完全不依赖于框架。 Typhoon的目标是非侵入性的。(我曾经参与过Spring Framework的介绍工作,并为SpringSource在全球教授过该主题,所以我对这个话题相当熟悉)。 - Jasper Blues
显示剩余4条评论

15
......有没有其他值得再了解的竞争框架? Objection是我在谷歌上能找到的适用于iOS的DI库,所以如果你想使用预先构建好的库,则可能要使用它。
DI并不需要特定的框架才能使用。 如果您的应用程序很小,则可以在应用程序根部创建所有实例并手动注入。
如果您需要更多功能,并且现有的框架对您来说不够用,则可以自己编写服务定位器,然后在其上构建DI容器。
您还可以从另一个平台移植现有的较小框架。 例如,.Net上有几个“小”框架-NinjectSimpleInjector
......这是iOS的常见选择吗...?
由于只有一个作者/贡献者列出,因此似乎这是一个相当小的项目。 没有太多问题被提出。 但是iOS市场相当大。 因此,我认为只有极少数iOS开发人员使用此库。
但这并不一定是坏事。 似乎它是由一个小公司创建、使用和支持的。 过去一年中一直有相当稳定的更新
根据我的类似规模的开源项目的经验:我并不总是很快获得新功能,并且经常是我最终找到错误的人。 但是,对现有功能集的支持往往非常快速,并且会仔细处理我发送的支持电子邮件。 您的体验可能会有所不同。

2
你对Objection的观察是准确和公正的。我是该项目迄今为止最大的贡献者,这意味着我通常会添加我需要或受到启发而制作的功能。我会非常快速地响应错误。然而,我倾向于长时间考虑功能请求,因为我希望确保Objection的身份不会丢失,也不会变得“臃肿”。Objection已经被用于相对流行的应用程序中。根据与之相关的崩溃日志和我进行的性能测试,它并没有导致崩溃或性能瓶颈。 - justice
2
最后一件事。Objection经过了非常好的测试:https://github.com/atomicobject/objection/tree/master/Specs - justice
@justice:你有它被使用过的应用程序清单吗?这可能有助于在网站上让人们了解这些(当然要列在网站上-在这里列出来不太合适)。可能需要获得许可。但是,证明书往往有助于回答“这个库有多受欢迎?”这样的问题,并帮助吸引新用户。 - Merlyn Morgan-Graham
我能谈论的一个应用是“SideReel”。我们已经有一年没有积极地开发它了(Side Reel维护它)。但它曾多次被App Store推荐。 - justice

11

希望您能原谅我在这里做点宣传,但我刚刚发布了自己的Objective-C DI框架:Syringe

https://github.com/tomekc/Syringe

出于简单和轻量化的目的,我特意设计了这个框架,我的主要目标是尽可能地不干扰其他操作。由于我有很强的Java背景,所以我参考了Google Guice和Spring来设计它。


2
对于这个推荐,我点赞。如果你想要一个好的方法来介绍DI(因为在Objective-C世界中它是一个相当未被探索的概念),可以看看NInject的“入门”wiki页面。NInject专注于构造函数注入而不是基于属性的注入,但他们的教程如何建立DI概念非常有效。 - Merlyn Morgan-Graham
爱!虽然我对Objection感到兴奋,但我更喜欢你如何自动化履行。不过,Objection仍然提供了更多的灵活性。那么属性呢?你打算扩展Syringe吗? - Texas
我目前在我的小型私人项目中使用它,并且我很乐意听取用户的反馈。 - Tomek Cejner
@Merlyn Morgan-Graham,感谢您提供的Ninject链接! - Nick Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接