首页 > 其他分享 >1、领域驱动设计最佳实践

1、领域驱动设计最佳实践

时间:2023-05-08 17:44:22浏览次数:26  
标签:err fmt 实践 order 最佳 驱动 Order main ID

分层概念

在领域驱动设计中,通常将一个应用系统划分为四层架构,分别是表现层、应用层、领域层和基础设施层。

  • 表现层:负责处理用户界面和用户交互,如接收用户输入,显示输出结果等。
  • 应用层:负责协调应用程序的活动,如处理业务用例和业务流程等。
  • 领域层:负责实现业务逻辑和业务规则,包含领域模型和领域服务等。
  • 基础设施层:负责提供技术支持,如数据持久化、消息传递、日志记录等。

这四层之间有着严格的依赖关系,上层依赖于下层,而下层不依赖于上层。这样的分层架构有助于实现高内聚低耦合的设计原则。

目录架构参考

├─catalog // 商品目录子域
│ ├─application // 应用层
│ │ ├─brand
│ │ ├─category
│ │ ├─collection
│ │ └─product
│ ├─domain // 领域层
│ │ ├─brand // 商品品牌模块
│ │ ├─category // 商品类目模块
│ │ ├─collection // 商品集合模块
│ │ └─product // 商品模块
│ ├─infrastructure // 基础设施层
│ │ └─persistent // 持久化
│ │ ├─jpa
│ │ ├─mybatis
│ │ └─redis
│ └─presentation // 表现层
│ ├─graphql
│ ├─grpc
│ ├─rest
│ ├─view
│ └─websocket
└─order 
  ├─application 
  │ ├─dispute 
  │ ├─review 
  │ ├─shipping 
  │ └─source 
  ├─domain 
  │ ├─dispute 
  │ ├─review 
  │ ├─shipping 
  │ └─source 
  ├─infrastructure 
  └─presentation [^2^][1]

表现层demo

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello, this is the presentation layer!")
	})

	fmt.Println("Starting server on port 8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

应用层demo

package main

import "fmt"

type Order struct {
	ID string
}

type OrderService interface {
	CreateOrder(order Order) error
}

type OrderServiceImpl struct{}

func (s *OrderServiceImpl) CreateOrder(order Order) error {
	fmt.Printf("Creating order with ID: %s\n", order.ID)
	return nil
}

func main() {
	orderService := &OrderServiceImpl{}
	order := Order{ID: "123"}
	err := orderService.CreateOrder(order)
	if err != nil {
		panic(err)
	}
}

领域层demo

package main

import (
	"errors"
	"fmt"
)

type Order struct {
	ID       string
	Quantity int
}

func (o *Order) Validate() error {
	if o.ID == "" {
		return errors.New("order ID cannot be empty")
	}
	if o.Quantity <= 0 {
		return errors.New("order quantity must be greater than 0")
	}
	return nil
}

func main() {
	order := Order{ID: "123", Quantity: 2}
	err := order.Validate()
	if err != nil {
		panic(err)
	}
	fmt.Println("Order is valid")
}

基础设施层demo

package main

import "fmt"

type Order struct {
	ID string
}

type OrderRepository interface {
	Save(order Order) error
}

type OrderRepositoryImpl struct{}

func (r *OrderRepositoryImpl) Save(order Order) error {
	fmt.Printf("Saving order with ID: %s\n", order.ID)
	return nil
}

func main() {
	orderRepository := &OrderRepositoryImpl{}
	order := Order{ID: "123"}
	err := orderRepository.Save(order)
	if err != nil {
		panic(err)
	}
}

标签:err,fmt,实践,order,最佳,驱动,Order,main,ID
From: https://www.cnblogs.com/mingliangge/p/17382467.html

相关文章

  • 四轮轮毂电机驱动车辆,驱动电机故障状态估计(UKF)
    四轮轮毂电机驱动车辆,驱动电机故障状态估计(UKF)软件使用:Matlab/Simulink适用场景:采用无迹卡尔曼滤波UKF进行轮毂电机状态估计,失效电机估计状态为0,正常电机状态为1。产品simulink源码包含如下模块:→工况:方向盘正弦输入→整车模块:7自由度整车模型→估计模块:无迹卡尔曼滤波包含:simulin......
  • 轮毂电机分布式驱动电动汽车操稳性控制_DYC 直接横摆力矩控制
    轮毂电机分布式驱动电动汽车操稳性控制_DYC直接横摆力矩控制软件使用:Matlab/Simulink适用场景:轮毂电机分布式驱动电动汽车直接横摆力矩DYC控制(各轮差速差扭),可实现多种工况下整车行驶稳定性。产品simulink源码包含如下模块(购买时选取一种搭配即可):→整车模块:7自由度整车模型→上......
  • Node.js躬行记(28)——Cypress自动化测试实践
    最近在研究如何提升项目质量,提炼了许多个用于自测的测试用例,但是每次修改后,都手工测试,成本太高,于是就想到了自动化测试。在一年前已将Cypress集成到管理后台的项目中,不过没有投入到实践中。今天在实践时发现,版本已经到了12.X,当时集成的版本是8.X。一、准备在......
  • boot-admin开源项目中有关后端参数校验的最佳实践
    我们在项目开发中,经常会对一些参数进行校验,比如非空校验、长度校验,以及定制的业务校验规则等,如果使用if/else语句来对请求的每一个参数一一校验,就会出现大量与业务逻辑无关的代码,繁重不堪且繁琐的校验,会大大降低我们的工作效率,而且准确性也无法保证。为保证数据的正确性、完整性,前......
  • 《后台开发:核心技术与应用实践》第五章 核心技术与应用实践
    文章目录一、基础知识二、strace1.基础知识2.strace:跟踪系统调用来让开发者知道一个程序在后台做什么事情(1)strace基本用法(2)strace跟踪信号传递(3)统计系统调用:strace-cXXXX(5)输出到其他文件:strace-oXXX(6)每个系统调用所花费的时间:strace-TXXX(7)记录系统调用发生的时间:strace-tXX......
  • PG数据库生态选型思路与最佳实践
    PG数据库生态选型思路与最佳实践2021-03-29 1157举报简介: PG数据库生态选型思路与最佳实践内容简要:1. 数据库发展的趋势2. 传统企业级数据库选型3. 数据库迁移的最佳实践4. 数据库迁移至PG整体解决方案   第一部分--数据库的发展趋势 数据库......
  • Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
    前言  基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。 笔者自身情况  笔者拥有硬件基础,单片机软硬基础,linux系统基础等各种,就是没有linux驱动框架基础,未做过linux系统移植和驱动移植开发了......
  • 原型设计工具比较及实践
    目录一:原型设计工具比较:1.墨刀2.Axure3.Mockplus二、原型设计1.主题名称2.功能3.界面设计考虑因素4.切换界面5.切换界面流程一:原型设计工具比较:1.墨刀适用领域墨刀是一款打通产设研团队,实现原型,设计,流程,思维导图一体化的在线协同工具。从记录想法的思维导图开始,到原型绘......
  • 字符设备驱动的框架
    字符设备驱动框架编写字符驱动设备框架时,主要的工作量在入口函数,卸载函数以及其设备文件操作函数当中。现在的很多板子写驱动不会像下面的程序这样的繁琐,但是从其中基本可以看到框架大体没变,所以用chatgpt生成了找个函数并修改,搭了字符设备驱动的框架。首先我们得明白一个字符......
  • CUDA编程 基础与实践 樊哲勇 电子书 pdf
    作者:樊哲勇出版社:清华大学出版社出版年:2020-10 关注公众号:红宸笑。回复:电子书即可  CUDA是目前较为流行的GPU高性能计算的开发工具之一。本书通过大量实例系统地讲述CUDA编程的重要方面。前12章通过一些简短的例子循序渐进地介绍CUDA编程的基础知识,主要包......