0

想象一個假想的對象有一些屬性:何處存儲值,以便傳送到業務層?

僞代碼:

class Student 
{ 
    Name: String; 
    Birthdate: DateTime; 
    Height: int; //inches 
    GPA: float; //"Grade Point Average" 
    Citizenship: string; 
} 

現在,用戶在值進入,目標讓他們:

名稱:Shelby Lake
生日:6/19/1991
身高:63
GPA: 5.6
國籍:United States

,並與所有的商業邏輯層可以驗證它:

BusinessLayer.ValidateStudent(student); 

在這個例子中它可以,例如,拋出一個異常:

ClientException 
GPA cannot exceed 4.00 (5.60) 

好,很好。但是,並非一切都在用戶類型可以 「適合」 的對象中:

名稱:Shelby Lake
生日:19 years ago
身高:5'3
GPA:n/a
國籍:n/a

事實上,我們的用戶可以在商業決策中輸入更友好的價值。與此同時,全球商業規則決定了某些輸入是否有效,例如

GPA:5.6(無效)
GPA:n/a(有效)
國籍:n/a(有效)
國籍:(無效)
身高:tall(無效)
身高:5'3(有效)

我的問題是,我在哪裏存儲這些string值,因爲我無法將它們純粹存儲在對象中。他們需要到達業務層,該層知道如何將輸入的文本解析爲值。

我首先想到的是改變類:

class Student 
{ 
    Name: String; 
    Birthdate: DateTime; 
    BirthdateFreeForm: string; 
    Height: int; //inches 
    HeightFreeform: string; 
    GPA: float; //"Grade Point Average" 
    GPAFreeform: string; 
    Citizenship: string; 
} 

這使得更多的任意值被髮送到業務層:

名稱:Shelby Lake
BirthdateFreeform:19 years ago
HeightFreeform: 5'3
GPA:4.6 Citizenship:n/a

BusinessLayer.ValidateStudent(student); 

而業務層可以自由格式值轉換爲規範的值,報告任何錯誤:

ClientException 
Country of citizenship must be entered ("n/a") 

但是,這似乎是這樣的醜陋答案我甚至不想考慮它。

用業務規則解析用戶輸入的企業方法是什麼?

回答

2

當用戶輸入的數據與模型表示數據的方式顯着不同時,我採用的一種方法是對視圖模型使用特定的類,並在此類中提供幫助器方法以將視圖模型轉換爲適當的域對象:

class StudentViewModel { 
    StudentViewModel(Student s) { 
     // map the properties of Student to the appropriate view model 
     // properties. 
    } 

    StudentViewModel() { 
     // use this for creating a new student. 
    } 

    Name: string 
    Height: string 
    GPA: string 
    // etc. 

    Student GetUpdatedStudent() { 
     // map your view model properties to the Student class 
     // and return an updated Student. 
    } 
} 

這種方法非常靈活,雖然涉及一些額外的工作。您可以直接針對ViewModel而不是域對象進行驗證,並確保您的模型不需要適應無效數據,這使得他們可以專注於表達域的真實目的,而不是始終防範無效數據。

此外,當您具有可轉化爲深度對象圖的「平坦」用戶體驗時,此方法變得非常有用。

+0

+1光滑....... – 2010-08-16 20:24:50