首重检查StepsProgression域:如果我们问我们的进程步骤的领域专家,我认为我们得到了一个可以接受的答案。然后我们可以说这是我们域的一部分。
接下来,你说的是这个实体还是VO?是的,它看起来像价值对象,实际上是一个价值对象,因为你不关心整个数据集的身份,它没有独特的含义(如果我不明白domaing是错误的)。
假设你有一个像的操作UI的表单向导和每一步的投入是不同的,我想实现这样的:
public class StepsProgression
{
private readonly string _userId;
public Step1 step1 { get; set; }
public Step2 step2 { get; set; }
public Step3 step3 { get; set; }
public StepsProgression(string userId)
{
_userId = userId;
}
}
// Immutable Step Object
public class Step1
{
public string input1 { get; }
public string input2 { get; }
public string input3 { get; }
}
您实例StepsProgression中的第一步,所以我假定你只知道他们的步骤是。所以构造函数只设置用户ID。然后,当用户填写第一步输入和点击下一页然后创建一个新的(immutable)的步骤对象,并将其设置为第一步。如果用户点击回,从第一步改变任何东西,然后再次单击接下来,然后你再创建一个新的第一步对象并将其分配给StepsProgression。
你能想到的更通用的实现(步骤),但由于输入是步骤之间的所有不同,这种明确的方式为您提供了编码约定。
执行编辑: 据我所知,StepsProgressions包含动态一套你刚刚创建StepsProgression之前确定的步骤。然后,假设你知道stepTypes事先我会改变我的实现如下:
public class StepsProgression
{
private readonly string _userId;
private readonly IStepProgressionBuilder _builder = new StepProgressionBuilder();
public IEnumerable<IStep> Steps { get; set; }
public StepsProgression(string userId, IEnumerable<string> stepTypes)
{
_userId = userId;
foreach (var step in stepTypes) // foreach smells here but you got the point
{
_builder.AddConcreteStep(step) // step = "Step1" for instance.
}
Steps = _builder.Build();
}
}
// Immutable Step Object
public class Step1 : IStep
{
public string input1 { get; }
public string input2 { get; }
public string input3 { get; }
}
// Builder Pattern with Fluent Methods
public interface IStepProgressionBuilder
{
// stepType = "step1" for instance. You have concrete Step1 class, so you return it.
// Start with a switch, then you refactor. (May involve some reflection)
void AddConcreteStep(string stepType);
IEnumerable<IStep> Build();
}
同样,你可以使用一个通用的步骤类,但随后你的建设者应该shomehow建立通过采取这一步骤应包含每个数据的步骤。如果你的步骤可能有超过3个属性,这将变成一个代码。这就是为什么我更喜欢有具体的步骤类,以便我可以将其构建为一个完整的数据集。
请注意setter:VO是不可变的,因此setter必须返回一个新对象 –
谢谢! StepsData确实是类似于状态的东西,因为当我们向它灌注某些东西时,我们正在改变状态。所以看起来我可以让StepsData成为一个带setter的值对象,它会返回一个新的值对象,我将用它来替换旧的对象? – Clickbeetle