介绍
假设我有三个域对象:
Proposition
Phase
Task
一个命题可以有一个或多个阶段。一个阶段可以有一个或多个任务。
如果我在最后一个阶段完成了最后一个任务,则提案必须设置为“已关闭”。
在代码中,我创建了这样的东西来完成阶段的最后一个任务
//My Business Layer does this:
--------------------------------------
pseudo:
var phase = _phaseRepository.GetById(id);
phase.LastTask.SetComplete();
// My Domain Entities look like this:
------------------------
public class phase()
{
public Task LastTask { get; set; } // not real code of course
}
public class Task()
{
public Phase Phase { get; set; }
public void SetComplete()
{
Phase.IsFinished = true;
}
}
问题
我在哪里将代码设置为“已关闭”?
选项
我认为有几个选择:
1)在域实体中:Task.SetComplete
public class Task()
{
public Phase Phase { get; set; }
public void SetComplete()
{
Phase.IsFinished = true;
Phase.Proposition.IsClosed = true;
}
}
2a) 在业务层
var phase = _phaseRepository.GetById(id);
phase.LastTask.SetComplete();
var proposition = _propositionRepository.GetById(phase.PropositionId);
proposition.IsClosed = true;
2b)在业务层中,也许有更好的方式:
var phase = _phaseRepository.GetByIdIncludingProposition(id);
phase.LastTask.SetComplete();
phase.proposition.SetClosed();
3)让一切都通过命题:
//My Business Layer:
var proposition = _propositionRepository.GetById(id);
proposition.CompleteTask(taskId);
// Domain Object:
public class Proposition()
{
public List<Phase> Phases { get; set; }
public void CompleteTask(long taskId)
{
var task = // psuedo: select relevant task from Phases.Tasks, using taskid
task.SetComplete();
task.Phase.SetFinished();
//psuedo: if task.Phase is last phase in proposition
Phase.Proposition.IsClosed = true;
}
}
关于选项
选项1有问题就行
Phase.Proposition.IsClosed = true;
因为 Proposition 不必加载,如果它没有加载,我们会得到一个异常。
选项 2a是有问题的,因为在执行 phase.LastTask.SetComplete() 之后,命题未处于正确状态。在任何可以访问 Phase 的代码中,“phase.LastTask.SetComplete()”可以在不对 Proposition 执行相关操作的情况下执行。
选项 2b与 2a 有同样的问题。
选项 3赋予 Proposition 类太多的责任。
你们有什么建议吗?