像Typhoon这样的依赖注入可以取代多个单身吗?

时间:2014-12-30 22:47:00

标签: objective-c typhoon

我有一个应用程序,在许多应用程序的方法和类中使用了大约11个不同的Singleton实例;它失控了,我想用依赖注入取代所有这些,比如Typhoon。但是,我无法找到任何关于如何用依赖注入取代单身人士的文件,样本或提及,包括台风。例如,我是否使用Typhoon的多个实例,用Typhoon实例替换每个单例?

1 个答案:

答案 0 :(得分:9)

台风创造者在这里。是的,依赖注入的一个用途是提供单身人士的好处而没有缺点。但是,您不一定需要一个库来应用依赖注入模式并替换您的单例。实际上,首先通过查看如何实现 而不使用 框架来理解模式是有帮助的:

好莱坞原则:别打电话给我们,我们会打电话给你

高级课程,例如视图控制器,可以让协作人员开展工作。正如你所提到的,你有大约11个。现在有两种方法可以将您的班级与合作者结合起来:

寻找(致电)合作者:

initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle 
{
    self = [super initWithNibName:nibname bundle:bundle];
    if (self) {
        _serviceClient = [MyServiceClient sharedInstance];
    }
} 

以上方式有效,但不好,因为:

  • 如果要提供替代实现,则必须更改使用它的每个类。
  • 这使得编写清洁单元或集成测试变得困难。您必须查看类的内部(玻璃盒测试),而不是关注外部接口合同(黑盒测试)。
  • 它提供过度紧密的耦合,导致内聚力差。

替代方案:

只需通过init方法或属性传递协作者。

initWitServiceClient:(id<ServiceClient>)serviceClient
{
    self = [super initWithNibName:@"MyNib" bundle:[NSBundle mainBundle]; 
    if (self) {
        _serviceClient = serviceClient;
    }
} 

这与众不同。 。 。传递参数?

而不是对协作者进行硬连接,而是将其作为参数传递。但现在下一堂课很难接线!所以你一直这样做,直到你有一个顶级汇编类,它知道如何从各个部分构建你的视图控制器(和其他类)。如果你这样做:

  • 每个单身人士的所有引用都指向一个地方。因此,用兼容的实现替换一个单例只需要一行代码更改。同样,您已封装此类的配置。
  • 为您的课程轻松编写单元和集成测试。在后一种情况下,您可以将一个组件修补为另一个组件。这可以克服集成式测试的两个缺点。第一个是难以将系统置于测试场景所需的状态,第二个是它们可能具有不必要的副作用。同时,纯单元测试也得到了简化,因为它现在很容易看到依赖合同并传递这些模拟或存根。
  • 课程清楚地记录了他们的&#34;接缝&#34;以及他们为了执行任务而委派的重要合作者是什么。这导致了高凝聚力&#34;。

现在使用Typhoon:

每个普通应用都会有一个保留的Typhoon实例。它会抓住你的单身人士。

如果在研究了上述材料后,您有一个更具体的问题,我们非常乐意为您提供帮助。