这样的情况下,golang中如何设计中间业务层最好

发布于 2022-09-13 00:12:53 字数 998 浏览 28 评论 0

业务需求:

ABCD十几种不同的业务他们有一项共同的复杂业务创建a,他们在调用创建a业务之前会组装自己的数据来传入创建a业务,传入的数据结构都是一致的。在创建a业务完成后,会生成对应的新的数据(结构也是一样),需再ABCD各自的不同业务处理(也可能不需处理直接结束)。

另外,ABCD可能会存在创建a前要执行某些操作(根据传入创建a的参数而定),完成之后要执行某些操作(也是根据生成的新数据的参数来定)。

type Hook struct {
    BeforeCreate()
    AfterCreate()
}

ABCD在调用公用a的时候,都会有一个他们自己的标识name string带着传入进去。

目前方案:

在创建a业务,完成之后会进行 switch 判断,然后进行不同的操作。

switch Task.Name {
    case "请假":
    case "迟到":
    case "缺勤":
}

以上的缺陷:

如果ABCD这样的业务不断新增,这个 switch 的判断会非常庞大,代码全都堆积到了一块。
能否有一种注册的方式。

type Hook struct {
    Name string 
    Func func()
}

var newData NewData
var hooks []Hook
var currTaskName string 

for _, h := range hooks {
    if h.Name == currTaskName {
        h.AfterCreate(newData)
    }
}
// newData 是业务a完成之后,会生成一些新的数据,给业务ABCD各自写入他们自己对应表

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

十级心震 2022-09-20 00:12:53
type PublicAParam struct{}   // 创建公共业务a需要的数据
type PublicA struct{}        // 公共业务a
type PublicARes struct{}     // 公共业务a生成的数据
func (p PublicA)Do(name string) PublicARes {  // 业务a自己的处理逻辑
    return PublicARes{}
}

type HandlePublicA interface {
    BeforeCreate(PublicAParam)PublicA
    AfterCreate(PublicARes)
    Name() string
}

type A struct {  // 其他业务A
    MyName string
}
func (a A)BeforeCreate(PublicAParam)PublicA{return PublicA{}}
func (a A)AfterCreate(PublicARes){}
func (a A)Name() string{return a.MyName}

func main(){
    param := PublicAParam{}
    hooks := []HandlePublicA{A{MyName: "A"}}
    for i := range hooks{
        p := hooks[i].BeforeCreate(param)
        after := p.Do(hooks[i].Name())
        hooks[i].AfterCreate(after)
    }
}

公共业务A返回处理后的数据再次由各个其他服务调用,这样是否可以?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文