Cocoa的依赖注入框架?

时间:2008-11-21 18:32:58

标签: objective-c cocoa dependency-injection

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

修改

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

12 个答案:

答案 0 :(得分:29)

AtomicObject的

objection。它是以Guice的形象塑造的。

答案 1 :(得分:16)

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

答案 2 :(得分:11)

我认为你会发现在Objective C,Ruby,Lisp等后期绑定语言中你并不需要它。就像Jamis的启示一样,当他试图建立针时,他正走下了一条过于复杂的道路,这是一个用于Ruby的Net::SSH revisited的DI框架。

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

答案 3 :(得分:5)

<强>台风

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

Typhoon-website列出了主要功能。快速摘要:

  • 非侵入性的。不需要宏或XML。使用 powerful Objective-C runtime approach

  • 可以轻松拥有相同基类或协议的多种配置。

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

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

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

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

  • 对循环依赖关系的出色支持。

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

  • 经过严格测试 - 用于各种Appstore特色应用

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

API文档和示例应用

质量控制:

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

  • 每次提交都会触发一系列regression tests
  • 我们保持高测试覆盖率。

答案 4 :(得分:4)

您不必在NIB文件中实例化该对象。如果将文件所有者设置为对象的类,然后链接视图/窗口中的内容/无论如何,您可以通过手动加载nib文件在运行时将对象设置为所有者。这样,您就可以拥有一个仍然可以正确注入依赖项的对象的动态实例。

答案 5 :(得分:3)

Objective-IOC

的依赖注入实现怎么样?

答案 6 :(得分:3)

ObjectivePim怎么样? ObjectivePim

答案 7 :(得分:1)

我写了一个非常简单的DI容器,代码在GitHub上。它只能做裸基础,即。发现对象的依赖关系并使用其他给定对象来满足它们。我发现可以在实际应用程序中使用,代码非常简单,并且很容易入侵。

答案 8 :(得分:-1)

有没有看过Mac OS X 10.6的Associative References功能?

我相信,有可能建立或已经有类似于DI的东西。 据我所知,对象中需要的任何引用都必须使用objc_getAssociatedObject()手动获取。

曼弗雷德

答案 9 :(得分:-1)

Interface Builder不会执行任何依赖注入。它不需要。 Interface Builder序列化对象。当一个笔尖被“唤醒”(又称打开)时,没有“依赖”要解决 - 只有要设置的属性。非常非常简单。打开笔尖仅依赖于NSCoding协议和键值编码。

依赖注入,在最好的时候几乎是一个make-work项目,或者充其量是独立设计的组件之间的通用粘合层,在编写良好的Objective-C代码中是没有用的。您正在寻找一种您不需要的工具。

在Objective-C中,需要匿名服务的软件声明了一个协议。然后服务采用此协议。客户端将服务作为动态插件加载。另一方面,如果服务器是在客户端之前编写的,那么只需编写一个新的插件即可使现有接口适应协议。与尝试定义中间数据驱动系统以便在运行时“发现”(请)接口相比,这样做的工作量更少,更简单。

对于每个人来说,DI的重要秘密在于它是用XML而不是母语编写代码的方式吗?我真的很想听到一个很好的论据,即XML在某种程度上是一种比真正的编程语言更好的编程语言。这没有任何意义。

答案 10 :(得分:-2)

我整天和Spring一起工作,我检查了Groovy。我绝不是一个XCode / Cocoa专家,但IB只做了一些依赖注入,而Groovy甚至没有真正声称要这样做。

我认为你不是在寻找DI,而是寻找一套编译良好的集成库,它可以帮助你输入很多其他人也输入的代码。我认为Cocoa没有类似Spring的框架,因为出于某些原因,人们倾向于将“开源”视为“不依赖平台”,因此可可有点被冷落了。

根据您的需求,有一些可用于Cocoa的免费开源库,所有这些库都在nice list的CocoaDev上列出。

我知道这不是春天,但我希望它有所帮助。

答案 11 :(得分:-2)

DI是需要动态绑定的运行时执行环境的属性。我对Obj-C和Cocoa很新,所以我可能会说不出话来。除非我遗漏了某些东西,否则我不会看到如何实现DI,除非通过解释Obj C而不是编译它,或者通过修改运行时环境。

我怀疑IB的DI行为是因为存在与使用它构建的应用程序相关联的特定于域的运行时环境。

我很高兴能够得到纠正。

类别似乎是mixin的实现,允许将方法动态分派给委托。相当酷和类似于Java的界面概念,认为细节不同,从以下情况来看,我无法看到是否可以在类别中定义常量,尽管成员字段不能。

objective-c categories