gpt4 book ai didi

c# - DDD : Enum like entities

转载 作者:可可西里 更新时间:2023-11-01 08:19:53 24 4
gpt4 key购买 nike

我有以下数据库模型:

**Person table**
ID | Name | StateId
------------------------------
1 Joe 1
2 Peter 1
3 John 2

**State table**
ID | Desc
------------------------------
1 Working
2 Vacation

领域模型将是(简化的):

public class Person
{
public int Id { get; }
public string Name { get; set; }
public State State { get; set; }
}

public class State
{
private int id;
public string Name { get; set; }
}

状态可能用于领域逻辑,例如:

if(person.State == State.Working)
// some logic

因此,根据我的理解,State 就像一个用于域逻辑检查的值对象。但它也需要出现在数据库模型中以表示干净的 ERM。

所以 state 可以扩展为:

public class State
{
private int id;
public string Name { get; set; }

public static State New {get {return new State([hardCodedIdHere?], [hardCodeNameHere?]);}}
}

但是使用这种方法,州的名称将被硬编码到域中。

你明白我的意思吗?这种事情有标准的方法吗?从我的角度来看,我正在尝试做的是使用一个对象(从 ERM 设计角度来看是持久的)作为我领域内的一种值(value)对象。你怎么看?

问题更新:可能我的问题不够清楚。

我需要知道的是,我将如何在我的域逻辑中使用存储在数据库中的实体(如 State 示例)。为了避免这样的事情:

  if(person.State.Id == State.Working.Id)
// some logic

if(person.State.Id == WORKING_ID)
// some logic

最佳答案

您建议的结构似乎不错。 (术语题外话:因为 State 有一个 ID,所以它不是一个 Value Object,而是一个 Entity。)

枚举是一种代码味道,所以不要尝试走那条路。使用 State 将行为移动到 State 对象中更加面向对象。模式。

不用写

if (person.State == State.Working)
// do something...

在你的所有代码中,这将允许你编写

person.State.DoSomething();

这更简洁,并且允许您在需要时添加新状态。

关于c# - DDD : Enum like entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237420/

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