欢迎 star
仓库地址:https://github.com/go-kratos/kratos
前情回顾
在前篇文章中提到了充血模型和贫血模型的概念,本篇文章将会讨论充血模型在注册/登陆业务中的应用,分析充血模型是如何分离业务和策略的。如果读者对充血模型、贫血模型等概念不熟悉,建议先翻阅相关的资料,对相关概念有大致的轮廓会对读者更有帮助。
开干
登陆业务流程分解
业务流程只是一个需求实现的大致流程,到了具体实现的时候还会有其他的操作流程的。一般的登陆认证流程大致能抽象成如图所示的流程: 但是回顾我们在biz层实现的时候,还做了参数校验、获取用户信息、加密密码等操作。这种就属于是流水账式的编程,在业务简单的时候可以这样一把梭。但是业务复杂的时候,一个方法就会很庞大,代码就会很臃肿,维护起来也会很困难。
让实现流程更接近业务流程
目前的贫血模型实现的流程如下: 从图中可以看出,其实很接近业务的流程了。接下来开始改造代码,我们实现充血模型代替目前的贫血模型。如下所示:
登录参数封装成对象
我们在biz里添加一个LoginRequest
的对象,用来封装登录的参数。对象的属性是私有的,通过提供的构造方法来构造对象。然后参数的校验逻辑就可以前置到对象的构造方法中,如下所示:
type LoginRequest struct {
username string
password string
}
func NewLoginRequest(username, password string) (*LoginRequest, error) {
// 校验参数
if username == "" {
return nil, fmt.Errorf("用户名不能为空")
}
if password == "" {
return nil, fmt.Errorf("密码不能为空")
}
return &LoginRequest{
username: username,
password: password,
}, nil
}
引入用户领域对象
参考DDD的设计,我们把