【发布时间】:2020-02-19 04:14:05
【问题描述】:
在 NBA 篮球比赛中,我想存储逐场比赛数据。一个游戏有它的StartTime、两个Teams 和播放列表。每个播放都有其发生的时间和(取决于播放)不同的属性。有8种不同的打法,例如:“Rebound”、“FieldGoalAttempt”:
反弹:
- 团队
- 播放器
- reboundType
射门尝试:
团队
射击游戏
协助玩家
阻塞播放器
shotType
距离英尺
积分
位置
结果
如你所见,这两种是完全不同的玩法——而且还有 6 种类型。这让我想到了我的第一个问题。
问题 1:如何在 C# 中实现它?
我的想法是创建一个类型Play,然后是8个类代表游戏类型,比如Rebound、FieldGoalAttempt、JumpBall这样的:
public class Play
{
public int PlayId { get; set; }
public int GameId { get; set; }
public int PlayerId { get; set; }
public Rebound Rebound { get; set; }
public FieldGoalAttempt FieldGoalAttempt { get; set; }
public Turnover Turnover { get; set; }
public Foul Foul { get; set; }
...
public JumpBall JumpBall { get; set; }
public Game Game { get; set; }
public Player Player { get; set; }
}
但我不确定这是否是“代码异味”。我还有一些想法:objects 的列表?还是自定义构建的 C# 类,其行为类似于“Union”?所以第一个问题是我应该如何在 C# 中处理这种情况?我的第一个想法好吗?
问题2:毕竟,我想将这些剧本存储在数据库中。在我的架构中,我使用表示数据库中表的模型。对于我的逻辑,我创建了Service,所以模型是“贫血”的,有些人称之为“反模式”,但我不想谈论它。我的逻辑有服务,它对我有用。
如果我决定创建 Union 类 - 我如何将这些剧本存储在数据库中?
【问题讨论】:
-
不清楚你在问什么,虽然你的问题描述性很强,但似乎与DDD关系不大,很难知道这些嵌套类型是什么(它们是什么类型的数据)
-
@MichaelRandall 等一下,让我澄清一下
-
喜欢
C++union 或TypeScriptunion 类型?C#没有类似的东西。 -
您可以使用 F# 为您的域模型建模,然后从您的应用程序代码中引用您的域库。在 C# 中,它们将是子类型。如果您将域模型用作 ORM 实体,则可以专注于最佳域模型或最佳表模型。如果您同时获得两者,那只是领域的巧合。
-
但我不确定这是否是“代码异味” - 如果您不确定,那么应该没问题。当您真正识别出一些可能会在进一步开发过程中带来问题的代码时,您会注意到“代码气味”。继续你的设计,当你真正开始遇到问题时 - 修复它。
标签: c# .net-core entity-framework-core domain-driven-design ef-core-3.1