2015-05-25 55 views
0

如果我有一個代表大量數據的複雜模型,並且我只希望顯示該模型的精簡版本(例如Name,Description),那麼MVVM中的最佳方法是什麼?Model或ViewModel何時代表MVVM中的數據子集?

我能找到的大多數解決方案似乎都假定數據已經存在於內存中,並推薦使用僅公開所需字段的新ViewModel。

但是,不是從數據庫中選出所有數據,而是選擇恰當的選擇。然後,我創建一個新模型來保存這些數據嗎?直接選擇ViewModel是可能的,但感覺是錯誤的。同樣,使用新模型來表示不同版本的相同數據也會有某種感覺。

這樣做的接受方法是什麼?

舉一個簡單的例子(簡單夠班,我通常不會這麼做):

public class User { 
    public int UserID {get;set;} 
    public string FirstName 
    public string LastName 
    public int AccessLevelID 
    public List<Groups> UserGroups 
} 

但我只真正需要:

public class PreviewUser { 
    int UserID 
    string FirstName 
} 
+0

老實說,沒有看到選擇視圖模型的問題。 –

+0

我擔心的是,它會變得與其父母模特班分開。對父項的更改不一定會反映在ViewModel中。但我認爲裁員模式也是如此。 –

回答

1

您可以使用是業務類型的子集創建另一個類型。 通常這被稱爲

DTO-數據傳輸對象它只封裝你所需要的。所以數據庫只需要查詢實體的子集。

public class UserDto 
{ 
     public int ID { get;set;} 
     public string Name{ get;set;} 
} 

其次,如果你需要一些UI邏輯添加到顯示它是常見的包裹特定DTO在更具體的UI模型。

public class UserUI 
{ 
    UserDTO _userDto; 

    UserUI(UserDTO userDto) 
    { 
     _userDto = userDto; 
    } 

    public string Name 
    { 
     get{return IsAfter_21_hours ? "The user as gone home" : _userDto.Name;} 
    } 
} 

UserViewModel將引用UserUI的一個實例。

-1

我覺得你不必創建新的模型類來保存用戶數據以供查看。相反,創建一個視圖模型類並將模型屬性映射到VM。見下面

public class UserViewModel 
{ 
    Public UserViewModel(User user) 
    { 
     //initialize required viewmodel properties here 
    } 
    int UserID {get;set;} 
    string FirstName{get;set;} 
} 
1

你可以刪除你不從模型中需要的屬性的例子(略微提升性能),或者你可以創建一個視圖模型,將只提供你要顯示的屬性。

下面是一個例子:

public class UserViewModel 
{ 
    private readonly User _user; 

    public UserViewModel(User user) 
    { 
     _user = user; 
    } 

    public int UserID 
    { 
     get { return _user.UserID; } 
    } 

    public string FirstName 
    { 
     get { return _user.FirstName; } 
    } 
} 
... 
var viewModels = userRepository.GetUsers().Select(user => new UserViewModel(user)); 

更新:

如果性能是真的對你很重要,你可以使用繼承。基類將是較小版本的數據,派生類將包含完整的數據。當需要從數據庫獲取一些字段並節省帶寬時,可以使用基類。

public class BaseUser 
{ 
    public int UserID { get; set; } 
    public string FirstName { get; set; } 
} 

public class User : BaseUser 
{ 
    public string LastName { get; set; } 
    public int AccessLevelID { get; set; } 
    public List<Groups> UserGroups { get; set; } 
} 
+0

這仍然會從數據庫中選擇所有數據,然後將其轉換爲所需的字段。 –

+0

您可以使用繼承。當你需要節省帶寬時,你可以使用基類,當你需要完整的數據時,你可以使用派生類。 –

+0

我更新了我的答案。 –

0

有辦法數你可以使用:

  • 使用 「完整版」 源模型。由於您正在構建用戶界面,用戶只會看到您想要顯示的內容;
  • 使用視圖模型,並將源模型包裝到此視圖模型中。實現是微不足道的,並且在UI之前數據量是有限的;
  • 使用視圖模型,並將數據從源模型複製到此視圖模型中。實現更復雜(既可以從現有模型映射,也可以只從數據庫加載所需數據),但視圖模型和模型完全分離。

其實,它取決於什麼更適合你。

請注意,「視圖模型」和「模型」之間的區別通常是模糊的。如果模型是這樣的:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

...和視圖模型 - 這樣的:

public class PersonViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

然後拋出此視圖模型了。雖然沒有區別,但不需要創建額外的類。

相關問題