BeeHive使用指南

本文介绍了BeeHive框架的核心——Module和Service,讲解了如何创建、注册Module和Service,以及如何响应事件和调用服务。BeeHive通过宏定义简化了模块注册和服务注册过程,并提供了配置文件进行管理。服务协议ServiceProtocol在模块间的交互中起到关键作用。了解BeeHive的运行原理,有助于更好地在项目中应用和管理模块化服务。

1. 前言

BeeHive使用的核心有两个:Module和Service。

  • Module

用于响应ApplicationDelegate的各种事件。

  • Service

用于一个模块使用另一个模块的功能。

2. Module创建

创建一个基于BHModuleProtocol的对象即可。

@interface Module : NSObject <BHModuleProtocol>

@end

@implementation Module

@end

3. Module注册

  1. 使用宏BeeHiveMod

例如:

@BeeHiveMod(Module)

该宏的定义:

#define BeeHiveMod(name) \
class BeeHive; char * k##name##_mod BeeHiveDATA(BeehiveMods) = ""#name"";
  1. 使用宏BH_EXPORT_MODULE

例如:

BH_EXPORT_MODULE(NO)

该宏的定义:

#define BH_EXPORT_MODULE(isAsync) \
+ (void)load { [BeeHive registerDynamicModule:[self class]]; } \
-(BOOL)async { return [[NSString stringWithUTF8String:#isAsync] boolValue];}
  1. 调用方法+ (void)registerDynamicModule:(Class)moduleClass;

例如:

+ (void)load {
    [BeeHive registerDynamicModule:[self class]];
}
  1. 配置文件BeeHive.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>URLGlobalScheme</key>
	<string>com.alibaba.beehive</string>
	<key>moduleClasses</key>
	<array>
		<dict>
			<key>moduleClass</key>
			<string>HomeModule</string>
			<key>moduleLevel</key>
			<integer>1</integer>
			<key>modulePriority</key>
			<string>600</string>
		</dict>
		<dict>
			<key>moduleClass</key>
			<string>TMTradeAdapter</string>
			<key>moduleLevel</key>
			<integer>1</integer>
			<key>modulePriority</key>
			<string>599</string>
		</dict>
	</array>
</dict>
</plist>

配置文件

4. Module响应

实现BHModuleProtocol的方法,例如:

- (id)init{
    if (self = [super init])
    {
        NSLog(@"Module init");
    }
    
    return self;
}

-(void)modInit:(BHContext *)context {
    NSLog(@"模块初始化中");
    NSLog(@"%@",context.moduleConfigName);
    
    id<ServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(ServiceProtocol)];
    service.itemId = @"我是单例";
}

- (void)modSetUp:(BHContext *)context {
    [[BeeHive shareInstance] registerService:@protocol(ServiceProtocol) service:[ServiceClass class]];
    
    NSLog(@"Module setup");
}

- (void)basicModuleLevel {
    
}

5. ServiceProtocol创建

创建一个基于BHModuleProtocol的协议。

@protocol ServiceProtocol <NSObject, BHServiceProtocol>

@end

6. Service创建

创建一个基于ServiceProtocol的对象即可。

@interface Service : NSObject <ServiceProtocol>

@end

@implementation Service

@end

BHServiceProtocol支持单例和多例:

  • 单例模式

Service对象实现方法+ (BOOL)singleton;+ (id)shareInstance;

+ (BOOL)singleton {
    return YES;
}

+ (id)shareInstance {
    static dispatch_once_t p;
    static id instance = nil;
    dispatch_once(&p, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

方法+ (BOOL)singleton;返回YES,BHServiceManager会调用Service类的方法+ (id)shareInstance;

  • 多例模式

Service对象实现方法+ (BOOL)singleton;+ (id)shareInstance;

+ (BOOL)singleton {
    return NO;
}

方法+ (BOOL)singleton;返回NO,BHServiceManager会调用Service对象的方法- (instancetype)init;

具体逻辑可参考BHServiceManager的以下代码

- (id)createService:(Protocol *)service withServiceName:(NSString *)serviceName shouldCache:(BOOL)shouldCache {
    if (!serviceName.length) {
        serviceName = NSStringFromProtocol(service);
    }
    id implInstance = nil;
    
    if (![self checkValidService:service]) {
        if (self.enableException) {
            @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:[NSString stringWithFormat:@"%@ protocol does not been registed", NSStringFromProtocol(service)] userInfo:nil];
        }
        
    }
    
    NSString *serviceStr = serviceName;
    if (shouldCache) {
        id protocolImpl = [[BHContext shareInstance] getServiceInstanceFromServiceName:serviceStr];
        if (protocolImpl) {
            return protocolImpl;
        }
    }
    
    Class implClass = [self serviceImplClass:service];
    if ([[implClass class] respondsToSelector:@selector(singleton)]) {
        if ([[implClass class] singleton]) {
            if ([[implClass class] respondsToSelector:@selector(shareInstance)])
                implInstance = [[implClass class] shareInstance];
            else
                implInstance = [[implClass alloc] init];
            if (shouldCache) {
                [[BHContext shareInstance] addServiceWithImplInstance:implInstance serviceName:serviceStr];
                return implInstance;
            } else {
                return implInstance;
            }
        }
    }
    return [[implClass alloc] init];
}

7. Service注册

  1. 使用宏BeeHiveService

例如:

@BeeHiveService(ServiceProtocol, Service)

该宏的定义:

#define BeeHiveService(servicename,impl) \
class BeeHive; char * k##servicename##_service BeeHiveDATA(BeehiveServices) = "{ \""#servicename"\" : \""#impl"\"}";
  1. 调用方法- (void)registerService:(Protocol *)proto service:(Class)serviceClass;

例如:

[[BeeHive shareInstance] registerService:@protocol(ServiceProtocol) service:[Service class]];
  1. 配置文件BHService.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<dict>
		<key>service</key>
		<string>UserTrackServiceProtocol</string>
		<key>impl</key>
		<string>BHUserTrackViewController</string>
	</dict>
</array>
</plist>

配置文件

8. Service调用

调用方法- (id)createService:(Protocol *)proto;

例如:

id<ServiceProtocol> service = [[BeeHive shareInstance] createService:@protocol(ServiceProtocol)];

最后

BeeHive的运行原理,可从BeeHive原理解析中获取。
模块间互相调用服务时,非常依赖ServiceProtocol。
所以项目中使用BeeHive时,需要将各个模块的ServiceProtocol放置于一个基础模块,且各个模块需依赖该基础模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值