name5566 / leaf

A game server framework in Go (golang)
Apache License 2.0
5.3k stars 1.32k forks source link

如何解决Module间的循环import #146

Closed xuyang3232 closed 5 years ago

xuyang3232 commented 5 years ago

比如有game和login两个Module,两个Module间会相互调用,比如login中调用game的rpc接口:game.ChanRPC.Go("xxx", agent,)。在game中也可能调用login的rpc接口,这样在import会出现循环依赖。不知道这种情况怎么解决?

xtutu commented 5 years ago
// 增加一个 BridgeChanRpc
// 大概长这样:
type BridgeChanRpc struct{
    Game  *chanrpc.Server
    Login   *chanrpc.Server
}
//初始化的时候把下面的方法执行下。
func (m *BridgeChanRpc) SetGameChanRpc(xxx){
    m.Game = xxx
}
func (m *BridgeChanRpc) SetLoginChanRpc(xxx){
    m.Login = xxx
}

//然后就可以随便用了:

bridge.game.GO(xxxxx)
bridge.login.GO(xxxxx)
name5566 commented 5 years ago

只要按 leaf 的规范来就不存在循环引用的问题

chiuan commented 5 years ago

只要按 leaf 的规范来就不存在循环引用的问题

老大的回答简直秒杀..

xuyang3232 commented 5 years ago

@name5566 ,我不是很明白,不同Module属于不同的功能模块,功能模块之间相互调用应该免不了的,那应该遵循哪个规范才能避免?请赐教!

15951836388 commented 5 years ago

你就用2楼的方式,就可以了

name5566 commented 5 years ago

@xuyang3232 遵循 leaf 规范不是说去避免循环引用,而是 leaf 规范已经支持了循环引用。具体看 leafserver 的写法,以及目前的一些范例。大概的规范是实现和接口分离,实现引用接口,比如说,a 模块的实现引用 b 模块的接口,而 b 模块的实现也可以引用 a 模块的接口,就是 a 和 b 模块循环引用了。再多的话也不如直接看代码容易理解

xuyang3232 commented 5 years ago

@name5566 ,谢谢,体会到了。

go-wolf commented 4 years ago

我也遇到这个问题 但是文档和leafserver 都没有模块相互调用的代码

go-wolf commented 4 years ago

大佬能贴一下相互调用的代码吗