我试图找到一个清晰而简单的例子来说明贫血域的真正含义。周围有很多理论,也有很多很好回答的问题。尽管如此,我仍然无法清楚地了解“贫血领域”的含义究竟在多大程度上。因此,我相信看到一个贫血域设计的虚拟实际示例会更简单,而不是问你如何将其演变为域驱动的设计......
所以,假设我们有一个TaskData类型的数据实体:
public class TaskData
{
public Guid InternalId { get; set; }
public string Title { get; set; }
public string Details { get; set; }
public TaskState ExplicitState { get; set; }
public IEnumerable<TaskData> InnerTasks { get; set; }
}
并且需要一个名为“ ActualState ”的附加属性,它是一个计算状态:如果 Task 有内部子任务,则值严格取决于子任务,否则,“ ActualState ”等于“ ExplicitState ”
如果我在一个单独的服务类(我称之为“引擎”)中编写这个逻辑,我们有:
internal class TaskStateCalculator
{
public TaskState GetState(TaskData taskData)
{
if (taskData.InnerTasks.Any())
{
if (taskData.InnerTasks.All(x => this.GetState(x) == TaskState.Done))
{
return TaskState.Done;
}
if (taskData.InnerTasks.Any(x => this.GetState(x) == TaskState.InProgress))
{
return TaskState.InProgress;
}
return TaskState.Default;
}
return taskData.ExplicitState;
}
}
第一个问题是:
即使TaskStateCalculator服务/引擎是我的域层的一部分,上面的代码是否反映了贫乏的域设计?如果是,为了避免这种情况,我们需要移动TaskData类中的逻辑(并将TaskData重命名为Task)。我对吗?
第二个问题是(实际上是一连串):
如果我们遇到更困难的情况怎么办?假设在Task实体中需要一个名为ComputeSomething的属性,并且该属性的逻辑需要访问整个 Task 的存储库。在这种情况下,Task类将依赖于TaskRepository。这样可以吗?EF 如何构造此类的实例?什么是替代方案?