DDD:枚举像实体一样

Chr*_*ris 12 .net c# design-patterns domain-driven-design

我有以下数据库模型:

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

**State table**
ID    |    Desc
------------------------------
1          Working
2          Vacation
Run Code Online (Sandbox Code Playgroud)

和域模型将(简化):

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; }
}
Run Code Online (Sandbox Code Playgroud)

状态可能在域逻辑中使用,例如:

if(person.State == State.Working)
    // some logic
Run Code Online (Sandbox Code Playgroud)

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

所以州可以扩展到:

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

    public static State New {get {return new State([hardCodedIdHere?], [hardCodeNameHere?]);}}
}
Run Code Online (Sandbox Code Playgroud)

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

你懂我的意思吗?对于这样的事情,有没有标准的方法?从我的角度来看,我想要做的是使用一个对象(从ERM设计角度来看是持久的)作为我域中的一种值对象.你怎么看?

问题更新: 可能我的问题不够明确.

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

  if(person.State.Id == State.Working.Id)
      // some logic
Run Code Online (Sandbox Code Playgroud)

要么

if(person.State.Id == WORKING_ID)
// some logic
Run Code Online (Sandbox Code Playgroud)

roh*_*agg 8

矿的前面的问题出土的,我怀疑是有关你的问题,特别是吉米·博加德的进行讨论一些有用的链接枚举类.

  • 我仍然不明白如何将枚举与数据库中的记录同步,特别是 ID 值,如果你坚持枚举 (2认同)

Mar*_*ann 7

您建议的结构似乎很好.(术语题外话:因为State有一个ID,它不是一个值对象,而是一个实体.)

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

而不是必须写

if (person.State == State.Working)
    // do something...
Run Code Online (Sandbox Code Playgroud)

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

person.State.DoSomething();
Run Code Online (Sandbox Code Playgroud)

这更清洁,如果需要,可以让你添加新的状态.

  • @Brian Leahy:我没有看到问题中任何地方提到的州*模式* (2认同)