Cocoa的依赖注入框架?

Bar*_*ark 52 cocoa dependency-injection objective-c

Interface Builder可用于Cocoa应用程序中的基本依赖项注入,但是当您不想在NIB文件中实例化对象时,是否有人知道Objective-C/Cocoa的更完整的依赖项注入框架?

编辑

为了澄清,我认识到IB可以用于基本的DI,但我正在寻找一个具有更完整功能的框架,包括单独的生产和测试配置,以及Groovy或Springs.

jus*_*ice 29

AtomicObject的反对意见.它是以Guice的形象塑造的.

  • 哇,看起来很邪恶.我仍然不知道为什么我需要这个,但我愿意学习. (2认同)
  • 谢谢,steipete.依赖注入在应用程序开发中最有用.最明显的好处是无需在整个代码库中手动构造对象或维护工厂(或工厂方法).DI图书馆也倾向于通过作曲来分离责任 - 我喜欢.然而,它不是开发库或"API"的理想选择,因为DI使对象的依赖性变得明显*.关于DI的好文章可以在[这里]找到(http://martinfowler.com/articles/injection.html). (2认同)

Cli*_*iff 16

我会站出来谈谈这个问题.如上面的答案所描述的依赖注入并没有解决那些寻求使用它的核心问题.我们想要一种开发方法,其中组件A不直接实例化或引用组件B.组件A由协议绑定到组件B,组件A根本不引用它.这允许组件B在任何时候都可以被替换而不用触摸组件A.我投票但我会研究你的参考文献,因为似乎有一些人同意你的看法.我不是想辩论,只是想学习.我想更多地了解"你不需要这样做"的方法.

  • 考虑一下,我想我理解了一点.无论实现如何,KVC和duck typing都允许任何属性访问和消息发送到给定对象.这并没有解决谁实例化依赖关系的问题,其中A - > B.可以使用IB将事物连接在一起,这很有趣,但不像实际依赖注入器那样充满特征. (2认同)

Ott*_*tto 11

我想你会发现在Objective C,Ruby,Lisp等后期绑定语言中你并不需要它.就像Jamis的启示一样,当他试图建立针时,他正走上一条过于复杂的道路,重新审视了Ruby- Net :: SSH的DI框架.

以下是一些链接,希望能为您提供一些示例代码,以便在Objective C中执行类似的操作.通过类别,您可以在运行时更改任何类的行为.请参阅Mac开发人员提示 - Objective-C:类别类别上Cocoa API文档.基本上你不需要一些中心位置来询问"可以配置x的东西",因为你可以直接实例化TheThingThatDoesX,如果其他东西需要改变/挂钩到那个行为,它可以使用类别.

  • 这个答案并不反映依赖注入背后的核心目的.我们的想法不是在运行时覆盖类行为,而是消除绝望组件之间的硬绑定.你能解释一下类别如何解决吗? (59认同)
  • 类别很棒 - 但我个人不知道他们如何让你了解DI.修改现有类与更改完整实现不同. (9认同)
  • 重读Brad Cox的论文后,我同意......他是英雄.但是_allows_后期绑定的系统与DI不同.我很想把你的眼睛重新给予ObjC的冷静,但它最终还没有完全回答我的问题. (5认同)
  • 我认为,Objective-C的设计师Brad Cox一生致力于松散耦合和软件重用.Objective-C的动态特性可以解决DI解决静态语言的问题.http://ieeexplore.ieee.org/iel2/190/267/00004852.pdf?arnumber=4852 (4认同)
  • 我不明白这个被接受的答案如何回答OP的问题.DI是关于松耦合和良好的应用设计.类/对象应该只满足特定目的.我发现自己编写了许多单一用途的类,并将它们注入到我的对象的构造函数中,而不是在使用DI之前(在Java中).那不应该适用于Objective-C吗? (4认同)
  • @Cliff如果组件真的"绝望",那么也许他们不介意被束缚在一起? (3认同)
  • ...特别是,我正在寻找一个框架,帮助将对象图构造与程序逻辑分开. (2认同)
  • 核心数据不符合您的要求吗?记住,Obj-C使用duck typing,你的视图不会关心你的控制器给它的是什么类型的对象(假设MVC,natch).我不认为我理解你想要解决的问题.也许用一个具体的例子开始一个完整的'其他问题? (2认同)
  • @ orange80我不确定我是否跟随.您能否解释一下如何允许您在运行时更改对象行为的语言功能,以解决对象独立使用的需求?这就像是说,"这款车有一个Bose环绕声立体声系统,所以真的不需要空调机!" (2认同)
  • @Cliff抱歉,这只是一个愚蠢的玩笑......你写的是"绝望"而不是"不同" (2认同)

Jas*_*ues 5

台风

差不多一年前,我发布了:https://github.com/typhoon-framework/Typhoon

台风网站列出的主要特点.快速摘要:

  • 非侵入性.不需要宏或XML.使用强大的Objective-C运行时方法.

  • 使相同基类或协议的多个配置变得容易.

  • 没有神奇的字符串 - 支持IDE重构,代码完成和编译时检查.

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

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

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

  • 对循环依赖性的出色支持.

  • 靠.它占用空间非常小,因此适用于CPU和内存受限的设备.

  • 经过实战测试 - 用于各种Appstore特色应用

  • 一个国际分布的核心团队(我们甚至监控StackOverflow),因此对您的任何问题的支持都是不可避免的:)

API文档和示例应用

质量控制:

我们还拥有强大的质量控制系统.

  • 每次提交都会触发一系列回归测试
  • 我们保持高测试覆盖率.