关于模块化,组件化

1.按业务分模块,按功能分组件

CTMediator的方案

各个模块通过CTMediator中的target-action方案调动

在CTMediator分类中是需要模块的调度,对模块起了一层封装
CTMediator使用runtime动态创建Target和调用Target中的Action来实现解耦。

#import "CTMediator+A.h"
@implementation CTMediator (A)
- (UIViewController *)A_aViewController
{
    //调用Target_A的Action_viewController
    
    return [self performTarget:@"A" action:@"viewController" params:nil shouldCacheTarget:NO];
}
@end

在模块A中写好target-Action规则

#import 
#import 
//我们在A工程中创建一个文件夹:Targets,然后看到A_Category里面有performTarget:@"A",所以我们新建一个对象,叫做Target_A。
@interface Target_A : NSObject

//对应的Action是viewController,于是在Target_A中新建一个方法:Action_viewController
- (UIViewController *)Action_viewController:(NSDictionary *)params;

@end

#import "Target_A.h"
#import "AViewController.h"
@implementation Target_A

- (UIViewController *)Action_viewController:(NSDictionary *)params
{
    AViewController *viewController = [[AViewController alloc] init];
    return viewController;
}

@end

ps:无法在编译检查阶段检测接口参数变更等问题

BeeHive

BHModuleProtocol

该框架的BHModuleProtocol是让模块有生命周期。

每个遵循BHModuleProtocol的模块注册后都会给BHModuleManager中做初始化存储起来,系统的事件会被传递给每个模块,让每个模块自己决定编写业务处理逻辑。

两种注册模式,一种是静态一种是动态

静态:
的在BeeHive.plist文件中注册符合BHModuleProtocol协议模块类

动态:

/*
1. Annotation方式注册
   编译时动态处理,动态生成代码
   通过BeeHiveMod宏进行Annotation可以在编译时动态添加该模块。
*/

@BeeHiveMod(LMHomeModule)
/*
 *   2.使用BH_EXPORT_MODULE宏注册
 */
@implementation HomeModule

BH_EXPORT_MODULE()  // 声明该类为模块入口

@end

BHServiceProtocol

BHServiceProtocol是提供接口和规范接口的类。

通过处理Event编写各个业务模块可以实现插件化编程,各业务模块之间没有任何依赖,core与module之间通过event交互,实现了插件隔离。但有时候我们需要模块间的相互调用某些功能来协同完成功能。

两种注册方式

1.API注册

[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];

2.BHService.plist注册




    
        HomeServiceProtocol
        BHViewController
    

对于有些场景下,我们访问每个声明Service的对象,希望对象能保留一些状态,那我们需要声明这个Service对象是一个单例对象。

我们只需要在Service对象中实现事件函数

声明

-(BOOL) singleton
{
    return YES;
}

service的注册过程

service注册后会给BHServiceManager中管理起来

//协议字符串作为key
    NSString *key = NSStringFromProtocol(service);
//implClass字符串左为value
    NSString *value = NSStringFromClass(implClass);
    
    if (key.length > 0 && value.length > 0) {
        [self.lock lock];
        [self.allServicesDict addEntriesFromDictionary:@{key:value}];
        [self.lock unlock];
    }

调用Service

id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

上下文环境BHContext

初始化设置应用的项目信息,并在各模块间共享整个应用程序的信息

[BHContext shareInstance].env = BHEnvironmentDev; //定义应用的运行开发环境
[BHContext shareInstance].application = application;
[BHContext shareInstance].launchOptions = launchOptions;
[BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/CustomModulePlist";//可选,默认为BeeHive.bundle/BeeHive.plist
[BHContext shareInstance].serviceConfigName =  @"BeeHive.bundle/CustomServicePlist";//可选,默认为BeeHive.bundle/BHService.plist
[[BeeHive shareInstance] setContext:[BHContext shareInstance]];

Demo地址

你可能感兴趣的:(关于模块化,组件化)