iOS開源:DecouplingKit - iOS 模塊化過程中模塊間解耦方案
DecouplingKit
Podfile
platform :ios, '7.0'
pod 'DecouplingKit', '~> 0.0.2'
DecouplingKit是一個用于模塊之間解耦的方案。
當App團隊的人數增長到一定人數之后會分出業務線,這樣就會就行模塊化工作來隔離開各個業務線,以便讓各個團隊能夠獨立工作。通用的方案是采用cocoapods把業務代碼分別拆到各個倉庫,一個業務線就是一個業務倉庫,當然如果更大拆分力度的話,一個小模塊就是一個cocoapods倉庫。這樣就對業務線就進行了物理路徑的隔離,各個業務線就不能隨便調用其他業務線的代碼。不過對于一定要調用的話還是可以引入頭文件來調用,所以本質上來講根本沒有解除各個業務倉庫之間的耦合。
解除耦合其中一部分是業務線頁面之間的跳轉,現在流行的方案是通過router來做。另外一部分很容易忽略就是業務線之間調用方法,屬性等,所以就有了DecouplingKit這個中間層來解決這個問題。DecouplingKit之后的業務邏輯可以看下圖。
DecouplingKit 只有一個類DKServiceManager,用來加載服務列表DKService.plist,服務就是一個業務中類提供的protocol,里面有其他業務需要調用的方法,屬性等。DKService.plist里面每一項有service和impl,service對于protocol,impl就是實現protocol的類。
比如業務1需要調用業務2的方法,只需要DKServiceManager通過protocol來找到對應業務2中的impl就可以了。其中protocol會集中放在BussinessPublicService倉庫,這里不依賴任何倉庫,protocol里面的方法對于入參和返回值都通過UIKit,Foundation等系統框架中類型,不需要自己的model類。對于業務2的實現類只要實現對應的方法就好。
DKServiceManager既可以返回實例,也可以返回類方法,當然對于你如果實現了父協議DKServiceProtocol的sharedInstance方法,也可以返回單例。
DecouplingKit是基于 BeeHive 改造的,BeeHive包括AppDelegate管理和模塊調用解耦兩部分,DecouplingKit專注于模塊調用解耦這部分,DecouplingKit只有一個類比起BeeHive輕量,支持調用實例和類方法,屬性。對比解耦的另一種方式就是通過runtime來做,例如 CTMediator ,通過一個中間層(對應BussinessPublicService)來公布對應的接口,接口調用CTMediator(runtime)來實現,這也是一種非常好的方案。
使用
注冊默認的DKService.plist服務列表
[[DKServiceManager sharedInstance] registerLocalServices];
注冊自定義路徑的服務列表
[[DKServiceManager sharedInstance] registerLocalServicesWithServiceConfigName:@"DecouplingKit.bundle/BeeHive"];
創建一個實例,如果這個Bussiness2ServiceProtocol對應的類實現了sharedInstance方法則生成單例,然后調用對應的實例方法
id<Bussiness2ServiceProtocol> v4 =[[DKServiceManager sharedInstance] createInstance:@protocol(Bussiness2ServiceProtocol)];
NSDictionary *data =[v4 fetchBussiness2DataWithName:@"DecouplingKit" age:@"1"];</code></pre>
創建一個類,然后調用對應類方法
Class Bussiness2 = [[DKServiceManager sharedInstance] createClass:@protocol(Bussiness2ServiceProtocol)];
[Bussiness2 callClassMethod];
創建自己業務線類的服務協議
@protocol Bussiness2ServiceProtocol <DKServiceProtocol>
@property (nonatomic,copy) NSString *name;
- (NSDictionary *)fetchBussiness2DataWithName:(NSString *)name age:(NSString *)age;
+ (void)callClassMethod;
@end
Licenses
All source code is licensed under the MIT License .
項目主頁:http://www.baiduhome.net/lib/view/home/1489379809089