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)
您建议的结构似乎很好.(术语题外话:因为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)
这更清洁,如果需要,可以让你添加新的状态.
归档时间: |
|
查看次数: |
6465 次 |
最近记录: |