1

我想用 Typhoon 框架注入 NSManagedObject 子类。我还没有看到这样的例子,但我认为这可能是可能的。

我正在使用 MO 生成器,并且在 NSManagedObject 和最终子类之间有一个超类。它在这个通用抽象基类中,如果这有什么不同,我想注入其中。

有没有人在这方面取得任何成功?

任何意见,将不胜感激。如果我可以提供更多信息,请告诉我。

4

1 回答 1

3

使用 Typhoon 设置核心数据:

首先,如果您想使用 Typhoon 设置 Core Data,以便您可以将数据源注入到您的视图控制器中,这里有一个Typhoon+CoreData+RAC示例应用程序,由Ryoichi Izumita 友情发布。表明:

  • Typhoon 的 UIStoryboard 集成
  • 核心数据
  • 反应性可可

在这个样本中。. .

顶层程序集是CDRApplicationAssembly

  • AppDelegate 在启动时注入一些核心数据组件。这允许应用程序委托在应用程序终止时保存上下文。
  • 这是一个CDRViewController,它在主故事板上声明。因为我们已经从应用程序的plist 文件中引导了 Typhoon,所以所有故事板都将是 TyphoonStoryboard 的一个实例。这些工作就像常规故事板一样,具有额外的好处,即根据我们程序集中的规则注入依赖项。这个控制器注入了一个核心数据数据源。
  • Ryoichi-san在 NSManagedObjectContext 上创建了一个类别,使得使用 DI 设置和集成 Reactive Cocoa 变得更加容易。

核心数据组装:

主程序集是指一个辅助程序集 - CDRCoreDataComponents,它负责设置核心数据。该文件中的一些值是从配置文件中加载的,这使得设置例如生产环境和测试环境变得容易。

现在具体解决你的问题。. .


自己注入模型类:

通常持久域对象往往具有没有方法的属性,并且许多人认为不应该是这种情况(Martin Fowler 和其他人称之为“贫血的域对象反模式”)。他们认为,在正确的面向对象设计中,模型对象将具有行为和属性,并且行为的理想位置靠近它们所代表的数据。

问题是:

  • 为了使域对象具有行为,它们必须经常依赖协作者。
  • 但是当然,如​​果对象寻找它们自己的依赖关系,我们就会有另一种反模式。DI 是必需的。


'hook-point' 方法(由 Typhoon 支持):

我们可以指示 Typhoon注入一个预先获取的实例,如下所示:

Knight* knight = ... //Loaded from persistent storage
[componentFactory inject:knight]; //Matches by type
[componentFactory inject:knight withDefinition:@selector(selectorInAssembly)];

这是“钩点”方法。在获得一个实例后,我们告诉 Typhoon 注入它。首先,我们将TyphoonComponentFactory自身注入到我们的数据访问对象、网络客户端或任何将发出该对象的东西中。作为最后一步,我们告诉 Typhoon 根据程序集中定义的配方注入我们的模型。瞧!


自定义核心数据集成(Typhoon 不支持):

除了使用这种“挂钩点”方法,也许我们可以提供与 Core Data 更紧密的集成(就像我们对 UIStoryBoard 所做的那样),这样就不需要上述步骤了?Typhoon 目前不支持此功能。


使用 AOP 注入域对象:(Typhoon 不支持)

事实上,除了针对 Core Data 的特定解决方案之外,还有另一种方法可以使用“AOP”注入任何域对象。我们的意思是拦截和检测域对象的所有 init 方法,以便随后根据程序集中的规则加载依赖项。这就是Spring(一种流行的 Java DI+AOP 框架)中的@Configurable注解的工作方式。问题是找到一种合适的方法来将模型对象与 a 关联起来,而这不会太具有侵入性(即单例)。说“这个 Product、Car 和 Holiday 的每个实例都与这个程序集相关联”有一些缺点,这就是为什么到目前为止我们偏爱“hook-point”方法的原因。TyphoonComponentFactory

您的反馈:

如果您对钩点方法感到满意,那就太好了。如果您对特定的核心数据集成或上述“AOP”解决方案感兴趣,那么我们很乐意与您一起探索它。已经有一些讨论了。

于 2014-11-09T02:38:43.790 回答