0
点赞
收藏
分享

微信扫一扫

Go-DDD示例

在Go语言中,使用DDD(领域驱动设计)编写一个简单的Hello World Web服务可以分为以下几个步骤:

  1. 创建项目结构: 在你的工作目录中创建以下文件夹和文件:
  • main.go:包含主要的程序入口和路由定义。
  • apps 文件夹:包含领域模型和业务逻辑。
  • infrastructure 文件夹:包含与基础设施相关的代码,如数据库操作、外部服务调用等。
  • interfaces 文件夹:包含与外部接口交互的代码,如HTTP路由、控制器等。
  1. 定义领域模型: 在 apps 文件夹中创建一个 greeting.go 文件,定义一个简单的领域模型 Greeting

package domain

type Greeting struct {
    Message string
}

func NewGreeting(message string) *Greeting {
    return &Greeting{
        Message: message,
    }
}

func (g *Greeting) GetMessage() string {
    return g.Message
}

  1. 实现业务逻辑: 在 domain 文件夹中创建一个 greeting_service.go 文件,定义一个简单的业务逻辑服务 GreetingService

package domain

type GreetingService struct{}

func NewGreetingService() *GreetingService {
    return &GreetingService{}
}

func (s *GreetingService) GetGreeting() *Greeting {
    return NewGreeting("Hello, World!")
}

  1. 实现接口: 在 interfaces 文件夹中创建一个 http_handler.go 文件,定义一个简单的HTTP处理器 HelloHandler

package interfaces

import (
    "net/http"

    "your-package-name/domain"
)

type HelloHandler struct {
    GreetingService *domain.GreetingService
}

func NewHelloHandler(greetingService *domain.GreetingService) *HelloHandler {
    return &HelloHandler{
        GreetingService: greetingService,
    }
}

func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    greeting := h.GreetingService.GetGreeting()
    w.Write([]byte(greeting.GetMessage()))
}

  1. 编写主程序: 在 main.go 文件中,创建一个简单的HTTP服务器,并注册 HelloHandler 处理器:

package main

import (
    "net/http"

    "your-package-name/domain"
    "your-package-name/interfaces"
)

func main() {
    greetingService := domain.NewGreetingService()
    helloHandler := interfaces.NewHelloHandler(greetingService)

    http.Handle("/", helloHandler)

    http.ListenAndServe(":8080", nil)
}

  1. 运行程序: 在命令行中,进入项目目录,并执行 go run main.go 命令。你将看到程序启动,并监听在 http://localhost:8080 上。
  2. 测试服务: 打开浏览器,访问 http://localhost:8080,你将看到浏览器显示 "Hello, World!"。

这样,你就成功使用DDD编写了一个简单的Hello World Web服务。请注意替换代码中的 your-package-name 为你的实际包名。

为了实现消息和端口的配置,你可以使用配置文件来定义这些参数。以下是一个示例:

  1. 创建配置文件: 在你的项目根目录下创建一个名为 config.yaml 的配置文件,内容如下:

message: "Hello, Go!"
port: 8080

  1. 解析配置文件: 在 main.go 文件中,添加代码来解析配置文件,并将配置参数传递给相应的组件:

package main

import (
    "io/ioutil"
    "log"

    "github.com/go-yaml/yaml"
    "net/http"

    "your-package-name/domain"
    "your-package-name/interfaces"
)

type Config struct {
    Message string `yaml:"message"`
    Port    int    `yaml:"port"`
}

func main() {
    // 读取配置文件
    configFile, err := ioutil.ReadFile("config.yaml")
    if err != nil {
        log.Fatal("Failed to read config file:", err)
    }

    // 解析配置文件
    var config Config
    err = yaml.Unmarshal(configFile, &config)
    if err != nil {
        log.Fatal("Failed to parse config file:", err)
    }

    // 创建服务组件
    greetingService := domain.NewGreetingService(config.Message)
    helloHandler := interfaces.NewHelloHandler(greetingService)

    // 注册处理器
    http.Handle("/", helloHandler)

    // 启动服务器
    addr := fmt.Sprintf(":%d", config.Port)
    log.Printf("Starting server on port %d...", config.Port)
    err = http.ListenAndServe(addr, nil)
    if err != nil {
        log.Fatal("Failed to start server:", err)
    }
}

  1. 更新领域模型: 在 domain 文件夹中的 greeting.go 文件中,更新 Greeting 结构体的构造函数,以接受消息参数:

package domain

type Greeting struct {
    Message string
}

func NewGreeting(message string) *Greeting {
    return &Greeting{
        Message: message,
    }
}

// 其他代码...

现在,你可以通过编辑 config.yaml 文件来配置消息和端口。运行程序时,它将读取配置文件并使用配置的参数启动服务。这样你就可以根据需要配置输出消息和端口。

举报

相关推荐

0 条评论