【发布时间】:2015-02-27 02:29:46
【问题描述】:
我有一个应用程序,它在许多应用程序的方法和类中使用了大约 11 个不同的 Singleton 实例;它已经失控了,我想用依赖注入替换所有这些,比如 Typhoon。但是,我找不到任何文档、示例或提及如何用依赖注入替换单例,包括 Typhoon。例如,我是否使用多个 Typhoon 实例,将每个单例替换为 Typhoon 实例?
【问题讨论】:
标签: objective-c typhoon
我有一个应用程序,它在许多应用程序的方法和类中使用了大约 11 个不同的 Singleton 实例;它已经失控了,我想用依赖注入替换所有这些,比如 Typhoon。但是,我找不到任何文档、示例或提及如何用依赖注入替换单例,包括 Typhoon。例如,我是否使用多个 Typhoon 实例,将每个单例替换为 Typhoon 实例?
【问题讨论】:
标签: objective-c typhoon
编辑:Pilgrim 是 Typhoon 的官方 Swift 继任者!!
台风创造者在这里。是的,依赖注入的用途之一是提供单例的好处而没有缺点。但是您不一定需要一个库来应用依赖注入模式并替换您的单例。事实上,通过查看如何在没有框架的情况下实现它首先有助于理解该模式:
好莱坞原则:不要打电话给我们,我们会打电话给你
高级类,例如视图控制器,会交给协作者来完成他们的工作。正如你所提到的,你有大约 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;
}
}
这与只是 . . .传递参数?
您无需硬连接协作者,而是将其作为参数传递。但是现在下一节课是硬连线的!所以你一直这样做,直到你有一个顶级的程序集类,它知道如何从各个部分构建你的视图控制器(和其他类)。如果你这样做:
现在使用台风:
每个普通应用都会保留一个 Typhoon 实例。它将容纳您的单身人士。
如果在学习了上述材料后您有更具体的问题,我们很乐意为您提供帮助。
【讨论】:
initWitServiceClient 中使用self.serviceClient = serviceClient; 而不是_serviceClient = serviceClient 中的this SO question?