是否可以使用Typhoon框架注入NSManagedObject实例?

时间:2014-11-08 23:40:33

标签: ios objective-c core-data dependency-injection typhoon

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

我正在使用MO Generator,并且在NSManagedObject和最终的子类之间有一个超类。它在这个常见的抽象基类中,如果这有任何区别,我想要注入。

有没有人有过这方面的成功?

任何建议都将不胜感激。如果有更多我可以提供的信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

使用Typhoon设置核心数据:

首先,如果你想用Typhoon设置核心数据,以便你可以将数据源注入你的视图控制器,那么Typhoon+CoreData+RAC样本应用程序是由{{3}发布的}}。它显示:

  • Typhoon的UIStoryboard集成
  • 核心数据
  • Reactive Cocoa

在此示例中。 。 。

顶级汇编为Ryoichi Izumita

  • AppDelegate在启动时注入了一些Core Data组件。这允许应用程序委托在应用程序终止时保存上下文。
  • 这是一个CDRApplicationAssembly,在主要故事板上宣布。因为我们从应用程序的CDRViewController启动了Typhoon,所有故事板都将成为TyphoonStoryboard的一个实例。这些工作就像常规故事板一样,还有一个额外的好处,就是根据程序集中的规则轮廓注入依赖项。该控制器注入了Core Data数据源。
  • Ryoichi-san创建了一个plist file,可以更轻松地设置DI并整合Reactive Cocoa。

核心数据汇编:

主程序集引用辅助程序集 - category on NSManagedObjectContext,它负责设置核心数据。此文件中的某些值是从CDRCoreDataComponents加载的,这样可以轻松设置例如生产与测试环境。

现在专门解决你的问题。 。 。


自己注入模型类:

通常持久域对象往往具有没有方法的属性,并且许多人认为不应该是这种情况(由configuration file调用)。他们认为,在正确的面向对象设计中,模型对象将具有行为和属性,并且行为的理想位置接近于它们所代表的数据。

问题在于:

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


“钩点”方法(受台风支持):

我们可以按如下方式指示台风Martin Fowler and others 'the anemic domain object anti-pattern

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

这是'钩点'方法。获得一个实例后,我们告诉Typhoon注入它。首先inject a pre-obtained instance进入我们的数据访问对象,网络客户端或任何将发出对象的内容。作为最后一步,我们告诉Typhoon根据装配中定义的配方注入我们的模型。瞧瞧!


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

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


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

事实上,除了Core Data的特定解决方案之外,还有另一种使用“AOP”注入任何域对象的方法。我们的意思是截取并检测所有域对象的init方法,以便随后根据程序集中的规则加载依赖项。这就是we inject the TyphoonComponentFactory itself(一种流行的DI + AOP框架)中@Configurable注释的工作原理。问题是找到一种合适的方法将模型对象与TyphoonComponentFactory相关联,而不会过于侵入(即单身)。说“这个产品,汽车和假日的每个实例都与这个组件相关”有一些缺点,这就是为什么我们赞成到目前为止的“钩点”方法。

您的反馈:

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