我问了这个问题已经快一年了,从那以后我和我的团队学到了很多东西。以下是我今天要回答这个问题的方法:
该域应代表(在代码中)业务是或现在(现实生活中)。那么,领域实体就是现实生活中发现的制品或行为者。那些生命之物和演员有什么样的行为?所有的。反过来,什么样的行为应该域名实体对他们有什么?所有的。
例如,在现实生活中,经理可以聘请新员工。该域的代表应包括像“经理”和“新员工”这样的实体。经理是这里的演员。
//newEmployee comes from somewhere else... possibly the UI
//someManagerId comes from the logged in user
var manager = _repository.Get<Manager>(someManagerId);
manager.Hire(newEmployee);
因此,经理实体模拟/反映现实生活中的行为,在这里。另一种方法是跳过经理实体作为一个演员,并把他推下去的角落这么繁重工作“域名服务”可以做所有的工作......这样的:
//newEmployeeService comes from somewhere else... possibly injected using IOC
newEmployeeService.Create(newEmployee, someManagerId);
在贫血域,您可以使用这样的域名服务来创建或雇用一名员工。它有效,但不具表现力,行为不可发现。谁做了什么?为什么经理需要创建一个新员工?
我认为,当我问的问题本来,我想尝试启动,包括在我的实体的更多行为,但我真的没有不注射服务到我的实体(例如知道怎么回事,用构造函数注入)。从那以后,我们学到了一些新的技巧,我们团队的实体超级表现力。简而言之,我们正在做的是:
- 我们试图在可能的情况下使用演员实体来表达正在执行动作的人或事物。
- 参与者具有表达他们可以执行的动作的方法
- 当需要服务时,它被作为参数注入到使用它的方法中。
- 我们使用BlingBag对每个域实体上的每个方法发起域事件,以提供可扩展性并为实体提供自持的能力。
单一职责与域驱动设计非常相似。我们在几个月前的NYCDDD聚会上对此进行了一次有趣的讨论...... – Domenic
我对这个讨论感兴趣。如果您想更深入地讨论ddd和行为,我并不认为 –