gpt4 book ai didi

go - 从 DDD 的角度来看,如何处理 DB 特定类型?

转载 作者:行者123 更新时间:2023-12-04 08:12:06 25 4
gpt4 key购买 nike

我正在尝试在我的项目中实现 DDD,并且我正在使用 Firestore 作为我的持久性基础架构。 Go 中的 Firestore 有一些特定类型,例如 *firestore.DocumentRef .
我认为我应该把它放在我的实体结构中,因为它应该代表我的模型,但我的实体也应该与 db 无关(我认为)。
那么我应该如何从 DDD 的角度处理这个实体/结构:

    type Holder struct {
SocialReason string `firestore:"social_reason" json:"social_reason"`
Contact value.Contact `firestore:"contact" json:"contact"`
Location value.Location `firestore:"location" json:"location"`
SubmissionDatetime time.Time `firestore:"submission_datetime" json:"-"`
UpdateDatetime time.Time `firestore:"update_datetime" json:"-"`
Status string `firestore:"status" json:"status"`
LastModifier *firestore.DocumentRef `firestore:"last_modifier" json:"-"`
CEP string `firestore:"cep,omitempty" json:"cep,omitempty"`
Country string `firestore:"country" json:"country"`
Region string `firestore:"region,omitempty" json:"region,omitempty"`
City string `firestore:"city,omitempty" json:"city,omitempty"`
}

最佳答案

您应该避免在您的域中表示任何类型的特定于实现的技术选择,除非 - 可能但不太可能 - 它们确实是所述域的通用语言的一部分(在您的示例中似乎不是这种情况)。
有一个关于使用 Golang 实现 DDD 的很棒的博客系列,伴随的代码库随着该系列引入更多与 DDD 相关的概念而不断发展。查看Wild Workouts例子。
您可以直接从此代码中学习,因为他们还在其 Ports and Adapters 中使用 Firebase 作为存储实现之一。建筑学。它们还具有 SQL 和 InMemory(用于测试)存储实现。
那么,它们如何表示firestore.DocumentRef在存储库 impl 之外?好吧,作为一个简单的 string .参见示例 GetUser() ..
/internal/users/firestore.go

type db struct {
firestoreClient *firestore.Client
}

func (d db) GetUser(ctx context.Context, userID string) (UserModel, error) {
doc, err := d.UserDocumentRef(userID).Get(ctx)

// More stuff to get the user model.
}
重要的是要注意,对于用户管理,他们不使用 DDD,而是使用基本的 CRUD(通过简单的用户管理用例,他们选择放弃 DDD 引入的额外复杂性)。
完整 DDD 设计的示例在 Trainer 和 Training 域中。这里有点复杂(例如处理事务),所以我引用 The Repository pattern: a painless way to simplify your Go service logic这解释了这些概念。
但是您可以清楚地看到域概念(存储库接口(interface))和实现(存储库适配器)之间的划分。例如在培训领域,实现 Hour :
  • /internal/trainer/domain/hour/repository.go --> GetHour()
  • /internal/trainer/adapters/hour_firestore_repository.go --> GetHour()
  • 关于go - 从 DDD 的角度来看,如何处理 DB 特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65903156/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com