首重檢查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