c# - gRPC 和域驱动设计 - 在哪里放置 proto 文件(域层与其他地方)?
问题描述
我在使用 gRPC 时遇到了正确架构的问题。在传统的 DDD 方法中,核心项目(即最内层/领域层)没有对外部层的引用,仅包含实体/聚合/接口/值对象等。这些的实际实现可能在不同的层(基础设施/应用程序/等)中进行
使用 gRPC,合约(即接口)是在 proto 文件级别定义的。但是这些原始文件必须编译为服务器/客户端才能工作。从我对 DDD 的介绍中,核心层实际上不应该有包引用(例如,在 .Net 核心中,我正在为我的核心域项目使用 .Netstandard 2.1 项目——它没有外部 nuget 包引用并且保持干净)。在正常情况下,您可以为标记接口等构建特定于域层的接口,以避免外部依赖项污染域层。但是对于 proto 文件,这是不可能的。
我可以选择三个选项:
- 将 proto 文件放在 core 项目中,在 core 项目中添加必要的包来编译它们
- 将 proto 文件放在核心项目中,但在另一个项目中构建它们(即在构建项目时,在另一个项目中获取对文件的相对引用并构建它们)
- 利用一个包含所有这些原始文件的共享项目并在那里构建它们
我想知道正确的方法是什么。我可以看到所有人的利弊,但想要一些关于一种方法是否比其他方法更好的信息。
解决方案
您不应该将 proto 文件放入域中。域必须仅包含业务逻辑而不包含其他内容。
如果我们谈论层 - 原始文件首先是对您的通信的描述。换句话说,表示层(API)是他们的好地方。
关于域中打包的附加内容 - 您可以执行此操作,但应将它们最小化。
推荐阅读
- php - 自创建日期起 24 小时后执行 php 脚本
- javascript - 在 ASP.net Web 表单上调用没有 OnClick 的文本框
- visual-studio-code - vscode.window.showTextDocument() 意外关闭当前文档
- node.js - 如何在 Adonis.js 中运行独特的测试
- routing - asp.net core web api属性路由:如何为控制器指定自定义名称或短名称
- bash - Bash 脚本中的 While 循环未从 Informatica 中的会话前命令执行
- matlab - 积分 2 在不应该时返回 0
- javascript - 我遇到了 ajax 获取请求的问题,有人可以帮助我吗?
- python - Python Fibonacci Generator,解释语法
- outlook - 约会的全局 ID