我正在使用golang构建RESTful API。 我正在使用gin-gonic框架和mgo进行mongodb连接。
我正在努力建立这种模块化......(我不认为我确切地知道我在说什么,并试图这样做.XD LOL)
与所有其他软件一样,我的项目有多个集合,未来会有更多的集合。
我想尽可能地将每个模块与其他模块分开,以便我可以
这是我目前的项目结构。
代码 https://gist.github.com/letsdevus/5121381be7cb1065e62ae403f14cd562
users
和contents
模块完全独立。
从项目中删除内容* .go文件将干净地禁用项目中的内容模块。
添加一些非依赖模块也很容易。我无需触摸任何代码,只需添加文件即可。
我会为此给予自己的荣誉。
但现在我正在尝试添加一个必须与其他模块交互的模块。
它被称为'活动'模块。 该模块必须与其他模块交互以跟踪正在发生的活动。
例如,当插入发生在用户集合上时,活动模块需要知道它发生了以便它可以记录活动。
实施活动模块的一种简单方法是在调用activities.insert("NewUser", Id)
后添加一行users.Insert()
。
这种方法的问题非常明显。
我希望你能听到我解决这个问题的计划,并告诉我它是否可行或是否还有其他更好的方法。
我目前可能的解决方案:活动经理
eventmanager.go
将作为main.go和database.go等基本文件之一添加到项目中。
eventmanager.go
package main
type EventFunc func()
type EventManager struct {
events map[string][]EventFunc
}
func (i *EventManager) AddEvent(eventName string, fn EventFunc) {
i.events[eventName] = append(i.events[eventName], fn)
}
func (i *EventManager) RunEvents(eventName string) {
for _, fn := range i.events[eventName] {
fn()
}
}
var eventManager EventManager // Globally available
在users.go
Insert()函数中,我添加了
eventManger.RunEvent("usersPostInsert")
在dbcUsers.Insert(&user)
之后。
在activities.go文件的init()中,我添加了
eventManager.AddEvent("usersPostInsert", newUserActivity)
在activities.go
func newUserActivity() {
// Do something. For now just print a message
log.Print("New User is Inserted!")
}
这样当我取消活动模块时,不会出现问题。
我希望你能理解我想要做的事情。
我真的很想知道这是不是解决这个问题的好方法。
P.S。如果你打算投票这个问题,因为它更像是代码审查,只需留下评论。 (以某种方式投票让我真的很不舒服大声笑)