alibaba/BeeHive

Module在模块内充当什么样的角色?

Closed this issue · 5 comments

完全阅读了各位大神的代码之后,我突然发现了一个问题,想跟大神们交流一下。首先说一下我对Module(模块)这个模型设计的理解:这个模型通过BeeHive框架来接收应用程序的消息,给具体的Module(模块)提供了一个统一的消息入口,以事件的形式发送给Module(模块),这样就使得Module(模块)不与应用程序耦合却可以获得应用程序的消息,得到了解耦的效果,这是对于模块外部的视角,非常完美。但是我们切换到模块内视角,每一个Module都是一个class,我们的一个业务模块(指一组clas构成的完整的业务功能)可能包括非常多的类,这些类是内耦的,必然可以直接访问,难免就会碰到一种情况,我们的业务模块的某个类需要跟我们的Module的实例通信,我们怎么与这个具象的Module实例通信呢?首先,我们要能访问Module的实例。然后我发现了BHModuleManager中的这段代

- (void)registedAllModules {
[self.BHModules sortUsingComparator:^NSComparisonResult(NSDictionary *module1, NSDictionary *module2) {
  NSNumber *module1Level = (NSNumber *)[module1 objectForKey:kModuleInfoLevelKey];
  NSNumber *module2Level =  (NSNumber *)[module2 objectForKey:kModuleInfoLevelKey];
    
    return [module1Level intValue] > [module2Level intValue];
}];

NSMutableArray *tmpArray = [NSMutableArray array];

//module init
[self.BHModules enumerateObjectsUsingBlock:^(NSDictionary *module, NSUInteger idx, BOOL * _Nonnull stop) {
    
    NSString *classStr = [module objectForKey:kModuleInfoNameKey];
    
    Class moduleClass = NSClassFromString(classStr);
    
    if (NSStringFromClass(moduleClass)) {
        id<BHModuleProtocol> moduleInstance = [[moduleClass alloc] init];
        [tmpArray addObject:moduleInstance];
    }
    
}];

[self.BHModules removeAllObjects];

[self.BHModules addObjectsFromArray:tmpArray];

}

BHModuleManager统一的初始化了所有注册到BeeHive里的Module(模块)类,并不像Service是在访问时创建实例。而且,Module(模块)并没有在BeeHive或者BHModuleManager中有任何的访问的接口,那么我们得到了一些,单例的,无法访问的Module(模块)实例,他们应该怎么使用?在业务模块(指一组clas构成的完整的业务功能)中,一个Module(模块)class是充当一个实体class,还是作为工厂用来创建其它实体class实例,建立他们之间的关系?
希望大神们能给我解答下疑惑,最大的希望是在Example代码中能有Module使用的更具体的演示,这样可以帮助初学者理解,使更多的人受益。还望不吝赐教 :)

beehive的模块现在只通过事件去响应,现在可以设置自定义事件,并且传递自定义参数,实现一些复杂情况,比如模块执行完事件再回调之类的。其他的方式都是创建新的service,通过protocol调用service去实现,你可以在模块中创建多个service,然后模块内部或者其他地方去调用service

至于模块是否要提供访问方式,我也在考虑这个问题,甚至应该还要提供销毁的方式,而不是所有的都一直存在

@ZoMinster 主要是,这个Module完全是静态的,只能访问它自己创建的对象,外部根本无法发送消息给它,除了使用事件的方式。它是一个完全事件驱动的东西了。我在想一种情况,比如,我的Module在一个事件发生时,需要向一个Class A的实例已创建的实例发送消息,注意这个实例已经创建了,并且不是由Module创建的,那么,问题来了,我们如何让Module有机会可以访问这个实例?唯一的可能就是把这个Class A 变成一个单例服务,在抽象的服务中完成这个过程。那么,如果这个调用结束需要回调怎么办,我们就不得不把回调变成一个事件。是这样的思路吗?感觉很多时候,我很难使用这个Module抽象,可能它的意图还不太好理解。sevice就好多了,不管怎样,还是感谢你的关注与答复。

xilin commented

@MemoryReload 我理解这边的设计是参考Spring进行的。在Spring Cloud的环境下,每个Module类似于独立部署的微服务。理想状态下是应该有context可以提供获取当前实例module的方法。

@xilin 我对Spring框架不是很了解,就不乱说了。其实BeeHive也提供了context,从context可以获取到ModuleManager(模块管理器)但是,模块管理器貌似没有提供访问实例module的能力。:)