我是一个能够翻译文本的助手。
我尝试寻找一个清晰简单的示例来解释“贫血领域”的真正含义。虽然有很多相关的理论和答案,但我仍然无法完全理解“贫血领域”所代表的含义。因此,我认为最好的方法是看一个虚拟的实际例子,了解什么是贫血领域设计,然后再考虑如何将其发展为面向领域的设计...
假设我们有一个类型为 TaskData 的数据实体:
我尝试寻找一个清晰简单的示例来解释“贫血领域”的真正含义。虽然有很多相关的理论和答案,但我仍然无法完全理解“贫血领域”所代表的含义。因此,我认为最好的方法是看一个虚拟的实际例子,了解什么是贫血领域设计,然后再考虑如何将其发展为面向领域的设计...
假设我们有一个类型为 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”的附加属性,它是一个计算状态: 如果任务有内部子任务,则该值严格依赖于子任务,否则,“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的repository。在这种情况下,Task类将依赖于TaskRepository。这样做有问题吗?EF如何构建这样的类的实例?有什么替代方案吗?