Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 从DDD的角度来看,如何处理特定于DB的类型?_Go_Design Patterns_Google Cloud Firestore_Domain Driven Design - Fatal编程技术网

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

Go 从DDD的角度来看,如何处理特定于DB的类型?,go,design-patterns,google-cloud-firestore,domain-driven-design,Go,Design Patterns,Google Cloud Firestore,Domain Driven Design,我正试图在我的项目中实现DDD,并将Firestore用作我的持久性基础设施。Go中的Firestore有一些特定类型,如*Firestore.DocumentRef 我认为我应该把它放在我的实体结构中,因为它应该代表我的模型,但我的实体也应该是db不可知的(我认为) 那么,我应该如何从DDD的角度处理这个实体/结构: type Holder结构{ SocialReason字符串`firestore:“social_reason”json:“social_reason”` 联系人值。联系人`fi

我正试图在我的项目中实现DDD,并将Firestore用作我的持久性基础设施。Go中的Firestore有一些特定类型,如
*Firestore.DocumentRef

我认为我应该把它放在我的实体结构中,因为它应该代表我的模型,但我的实体也应该是db不可知的(我认为)

那么,我应该如何从DDD的角度处理这个实体/结构:

type Holder结构{
SocialReason字符串`firestore:“social_reason”json:“social_reason”`
联系人值。联系人`firestore:“联系人”json:“联系人”`
位置值。位置`firestore:“位置”json:“位置”`
SubmissionDatetime.time`firestore:“submission\u datetime”json:-“`
UpdateDatetime.time`firestore:“update_datetime”json:-“`
状态字符串`firestore:“状态”json:“状态”`
LastModifier*firestore.DocumentRef`firestore:“最后一个修饰符”json:-“`
CEP字符串`firestore:“CEP,省略空”json:“CEP,省略空”`
国家字符串`firestore:“国家”json:“国家”`
区域字符串`firestore:“区域,省略空”json:“区域,省略空”`
城市字符串`firestore:“城市,省略空”json:“城市,省略空”`
}

您应该避免在您的领域中出现任何特定于实现的技术选择,除非-可能,但不可能-它们确实是所述领域普遍存在的语言的一部分(在您的示例中似乎并非如此)

有一个关于使用Golang实现DDD的很棒的博客系列,随着该系列引入更多与DDD相关的概念,附带的代码库也在不断发展。检查示例

您可以直接从这段代码中学习,因为他们还在其体系结构中使用Firebase作为存储实现之一。它们还具有SQL和InMemory(用于测试)存储实现

那么,它们如何表示存储库impl之外的
firestore.DocumentRef
?嗯,作为一个简单的
字符串
。例如见

/内部/users/firestore.go

类型db struct{
firestoreClient*firestore.Client
}
func(d db)GetUser(ctx context.context,userID字符串)(UserModel,错误){
doc,err:=d.UserDocumentRef(userID).Get(ctx)
//获取用户模型的更多内容。
}
重要的是要注意,对于用户管理,他们不使用DDD,而是使用基本CRUD(使用简单的用户管理用例,他们选择放弃DDD带来的额外复杂性)

完整的DDD设计示例在培训师和培训领域。这里有一点更复杂(例如,在处理事务时),所以我引用了这篇文章来解释这些概念

但您可以清楚地看到域概念(存储库接口)和实现(存储库适配器)之间是如何划分的。例如,在培训领域,实施
Hour

  • /内部/培训师/域/小时/存储库.go-->
  • /内部/培训师/适配器/小时\u firestore\u repository.go-->

我没有在我的应用程序结构中放入特定于db的类型。我会在db层转换它们。你会建议使用接口{}而不是类型本身吗?为什么要存储DocumentRef?使用它来获取所需的数据并将其丢弃。至少我会这么做。问题是你想要/需要什么。如果您希望独立于特定的数据源,那么如果您需要切换或需要实现辅助数据源,那么在模型中包含DocumentRef将是一场噩梦。如果你需要每一点的表现,它是不同的。但是你确定你需要它还是这是过早的优化?接口可以是速度和独立性之间的折衷。很好。我认为现在不值得这么头痛