goft
  • gin脚手架使用文档
  • 所需环境
  • 建议的目录结构
  • 配置
  • 最简单的启动代码
  • 出错跟踪
  • 自定义错误展示
  • 覆盖系统内置异常处理
  • 路由
    • 路由写在一个文件里
    • 常规设置
  • 控制器
    • 控制器形式
    • 控制器方法
    • 控制器方法不想返回值
    • 输出JSON
    • 获取请求对象
  • 全局中间件
    • 基本定义
    • 注册中间件
    • 示例1:判断token参数
    • 示例2:修改响应内容
    • 跨域中间件
  • 路由级中间件
    • 基本定义
    • 示例:参数验证和业务分离
  • 依赖注入
    • 基本定义
    • 注册依赖配置
    • 基本使用
    • 注入Gorm和XOrm
  • 精简版领域驱动
    • 基本说明和概念
    • 基本分层
    • 领域层
    • 领域层之实体
    • 领域层之值对象
    • 领域层之仓储
    • 领域层之聚合
    • 领域服务层
    • 应用层(application)
    • 应用层之DTO
    • DTO和实体映射
    • 应用层之应用服务层
    • 代码落地
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 精简版领域驱动

领域服务层

基本概念

实现特定于某个领域的任务。当某个操作”不适合”放在聚合(实体)或值对像上时,那么可以使用领域服务

操作内容

1、操作多个聚合根

2、也可以调用仓储层

3、代码可以相对灵活一些

4、命名一般要能直接描述出该代码业务的功能

譬如我们认为(也许你不这么认为)用户登录这块不方便放在聚合方法中

于是编写一个领域服务

type UserLoginService struct {
   userRepo repos.IUserRepo
}
func(this *UserLoginService) UserLogin(userName string,userPwd string ) (string,error)  {
    user:=this.userRepo.FindByName(userName)
    if user.UserId>0{ //有这个用户
      if user.UserPwd==utils.Md5(userPwd){
         //记录登录日志
         return "1000200",nil
      }else{
         return "1000400",fmt.Errorf("密码不正确")
      }
    }else{
      return "1000404",fmt.Errorf("用户不存在")
    }
}

还是那句话,领域驱动根据业务不同 允许有不同的理解

上一页领域层之聚合下一页应用层(application)

最后更新于4年前

这有帮助吗?