iOS開源:DecouplingKit - iOS 模塊化過程中模塊間解耦方案

caixiaohua 7年前發布 | 8K 次閱讀 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

 

 

 

 本文由用戶 caixiaohua 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!