2011-01-07 26 views
9

Tôi muốn biết lý do tại sao chúng tôi nên sử dụng MVVM để triển khai ứng dụng Silverlight. Ưu điểm của nó là gì?Tại sao tôi nên sử dụng MVVM trong ứng dụng Silverlight?

Chúng tôi không thực hiện Kiểm tra đơn vị cho ViewModel, vì vậy tôi muốn các lý do khác.

Dưới đây là những câu hỏi của tôi về một số lợi thế người ta thường nói:

1.Loosely Cùng: Khi chúng ta sử dụng MVVM, một cái nhìn dựa trên ViewModel nhưng không phải là một cái nhìn, tại sao nó lỏng lẻo?

2.Nếu tôi cung cấp các phương pháp công khai theo mã, chúng cũng có thể cung cấp khả năng sử dụng lại.

+0

Nếu bạn cung cấp tài sản và lệnh trong một mã-đằng sau và ràng buộc họ sử dụng 'this.DataContext = này;', đó là một viewmodel quá . Chỉ cần không sử dụng mã như 'this.firstNameTextBlock.Text = this.CurrentItem.FirstName;' – vorrtex

Trả lời

4

Vâng, đơn vị testability của chế độ xem mô hình là một lợi thế đáng kể, vì vậy bạn sẽ bỏ lỡ lợi ích đó. Về hai người kia:

lỏng

Vâng, quan điểm không dựa vào quan điểm mô hình. Chúng phải được kết nối theo một cách nào đó để hoàn thành chức năng của ứng dụng. Kết quả là, chúng không thể tách rời được. Các lựa chọn duy nhất được kết hợp chặt chẽ hoặc lỏng lẻo-coupled hoặc một nơi nào đó ở giữa. Với MVVM, view-model của bạn tương tác với view của bạn theo một cách rất hạn chế: về cơ bản chỉ là các đối tượng, các thuộc tính và các lệnh. So sánh điều này để thực hiện mọi thứ trong mã phía sau, nơi chế độ xem và kiểm soát của nó về bản chất là không thể tách rời.

Tái sử dụng

Nếu bất kỳ mã trong bạn code-behind được tái sử dụng, đủ để khen là công cộng, nó có thể được đưa ra khỏi mã-đằng sau và đưa vào một lớp học có mục đích chung. Vấn đề là những gì còn lại sau đó không thể tái sử dụng được.

Nếu bạn không muốn đi sâu vào MVVM, bạn có thể nhận được một số lợi ích của MVVM bằng cách tập trung vào dữ liệu. Sau khi bạn tìm hiểu những lợi ích của databinding, bạn có thể xem xét lại các lợi ích khác của MVVM.

4

Chúng tôi không làm Unit Test cho ViewModel,

Với MVVM, nó không chỉ là về kiểm tra đơn vị ViewModel. Lý tưởng nhất, máy ảo của bạn nên rất mỏng và chỉ có các thuộc tính cần thiết theo chế độ xem. Vì vậy, nó không thực sự cần thiết để kiểm tra VM.

Nhưng, không có máy ảo, bạn làm cách nào để kiểm tra tính năng/chức năng của mình trên các lớp? Trong Silverlight, để tạo điều kiện thử nghiệm, bạn nên sử dụng các lệnh, thay vì viết mã trong các tệp mã-đằng sau. Điều này cho phép bạn mô phỏng nhấp chuột vào nút và các sự kiện GUI khác trong khi kiểm tra đơn vị. Sử dụng mẫu MVVM cùng với các lệnh, bạn có thể kiểm tra tất cả mã C# (không phải xaml), phải lên đến giao diện người dùng (Chuyển đổi, máy ảo, v.v.).

Nếu tôi cung cấp phương thức công khai theo mã số , họ cũng có thể cung cấp khả năng sử dụng lại.

Không đi sâu vào chi tiết về thiết kế xấu như thế nào, tôi muốn hỏi bạn, Làm thế nào để cung cấp khả năng tái sử dụng? Nếu bạn tạo một điều khiển người dùng, thì lớp mã-đằng sau là một điều khiển? Bạn muốn tạo các trường hợp kiểm soát của bạn và sử dụng chúng? Điều này giống như nói rằng tại sao chúng ta cần các phương thức thành viên, chúng ta chỉ có thể tạo các phương thức tĩnh công khai và truy cập chúng. Tôi có một ý kiến ​​mạnh mẽ rằng nếu chúng ta không muốn sử dụng các ràng buộc tự động được cung cấp bởi WPF/Silverlight, thì tốt hơn là KHÔNG sử dụng các công nghệ này. Và để khai thác toàn bộ khả năng ràng buộc, MVVM là điều cần thiết.

lý do tại sao nó được ghép nối lỏng lẻo?

VM là một phần quan điểm của bạn. Nó không được tách rời khỏi khung nhìn. Như tôi đã nói, máy ảo của bạn phải mỏng nhất có thể với chỉ các thuộc tính công khai mà chế độ xem của bạn cần. Logic nghiệp vụ của bạn sẽ được tách riêng khỏi chế độ xem của bạn (và VM).

1

Tôi có thể trả lời cách tôi sử dụng mẫu MVVM. MVVM tốt hơn trong các trường hợp sau:

1 Nếu một số điều khiển bị ràng buộc với một thuộc tính duy nhất.

MVVM:

<TextBlock x:Name="text1" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/> 
<TextBlock x:Name="text2" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/> 

tôi nhanh chóng có thể thêm một điều khiển tương tự hoặc loại bỏ một điều khiển hiện có.

Hãy so sánh với code-behind:

public string IsSomePropertyTrue 
{ 
    set 
    { 
     //... 
     text1.Visibility = value; 
     text2.Visibility = value; 
    } 
} 

2 Thay vì một đa chuyển đổi

công Cọ StateColor { được { if (this.State == State.Edited & & this.IsPriority) trả về SolidColorBrush mới (Color.FromArgb (255, 0, 255, 0)); // ... }}

<sdk:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock Background="{Binding StateColor}" Text="{Binding State}"/> 
    </DataTemplate> 
</sdk:DataGridTemplateColumn.CellTemplate> 

3 Là một mô hình mục trong điều khiển giống như ListBox hoặc DataGrid. Ví dụ, nếu tôi muốn tạo một danh sách các mục có nút remove gần mỗi mục, tôi sẽ tạo ra một điều khiển ItemView và một lớp ItemViewModel.

<ItemsControl ItemsSource="{Binding SomeItems}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <view:ItemView DataContext="{Binding}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

4 Sao chép dữ liệu từ một cái nhìn khác:

public JournalEntryViewModel(SalesOrderViewModel vm) {} 

5 ViewModel có thể kế thừa CLR-lớp học và thực hiện các giao diện (INotifyPropertyChanged hoặc INotifyDataErrorInfo).

Ngoài ra tôi sử dụng MVVM để thay thế sự kiện bằng lệnh hoặc thuộc tính. Và sử dụng các lực lượng ViewModels để gọi các thuộc tính theo tên dễ hiểu.

0

Điều thú vị trong MVVM là liên kết động tự động.

Hãy tưởng tượng rằng mô hình chế độ xem của bạn có các thuộc tính như sau: bool IsFirstNameVisible, bool IsFirstNameEnabled, string FirstName, double FirstNameWidth, v.v.

Trong tệp XAML của bạn, bạn xác định TextBox với x: Name = "FirstName" và gọi MVVM-binder động của bạn. Nó kiểm tra lớp mô hình khung nhìn của bạn thông qua sự phản chiếu, xem những thuộc tính bạn đã định nghĩa và liên kết chúng với các thuộc tính tương tự của điều khiển có cùng tên, áp dụng các trình biến đổi giá trị nếu cần.

Trong trường hợp này, bạn nhận được XAML rất sạch sẽ, không có biểu thức ràng buộc và chuyển đổi dữ liệu dài hàng kilômét.

Đó là những gì thư viện MVVM của tôi thực hiện.

0

Tách các con người. Tách mối quan tâm.

Hãy quên thử nghiệm đơn vị (tôi thích nó; nhưng đó không phải là điều ở đây). Hãy quên đi khả năng sử dụng lại (bạn có thực sự sử dụng lại các mô hình xem không? Không, chúng ta hãy thực sự ở đây).

Đó là về Tách mối quan tâm và đặt mã và logic nơi nó thuộc về. Toàn bộ ý tưởng là khả năng bảo trì; có thể thay đổi mã khi nó phát triển theo thời gian mà không phá vỡ các thứ khác và không biến toàn bộ thứ thành một đống mì spaghetti lớn.

MVVM, được thực hiện đúng cách, cho phép mã của bạn được tách thành các phần logic hợp lý và cho phép tái cấu trúc nhanh và thay đổi khi yêu cầu của ứng dụng thay đổi. Việc tìm kiếm dễ dàng hơn ở nơi điều gì đó là khi bạn cần thực hiện thay đổi. Cố gắng viết bất kỳ ứng dụng nửa chừng phức tạp nào và sau đó để nó một mình trong một tháng, sau đó quay trở lại với nó và cố gắng thực hiện những thay đổi đáng kể. Một ứng dụng có cấu trúc phù hợp với việc sử dụng MVVM một cách thận trọng là cách dễ dàng hơn để bẻ khóa sau khi bị sa thải và cách dễ dàng hơn để thực hiện thay đổi.

1

Tôi đã sớm chấp nhận WPF và tôi có thể cho bạn biết điều gì khiến tôi chọn MVVM (và điều này càng ít áp dụng cho Silverlight). Đối với dự án tôi đang làm việc, tôi phải tạo một màn hình cho phép người dùng đăng ký thông báo trong hệ thống. Đây là một quá trình gồm 3 bước:

  1. Người dùng phải tìm kiếm chi tiết họ muốn được thông báo về
  2. Họ phải chọn mục và điền thêm các tùy chọn liên quan đến đăng ký
  3. Hệ thống này có để cung cấp bản tóm tắt và cho phép người dùng xác nhận hoặc chỉnh sửa đăng ký.

Sau khi triển khai chức năng lần đầu tiên (không có MVVM), tôi được thông báo rằng chúng tôi cần loại trừ khỏi các mục tìm kiếm đã được người dùng đăng ký.

Sau khi khắc phục, tôi được thông báo rằng chúng tôi cần cung cấp cho người dùng bản xem trước trực tiếp của đăng ký dựa trên các tùy chọn.

Lúc đó tôi bắt đầu nhận thấy rằng một số thay đổi này có thể được trích xuất và dễ dàng hơn nếu tôi không phải xử lý giao diện người dùng khi tôi thay đổi logic. Tôi đã không bao giờ cố ý theo MVVM nhưng tôi nhận ra rằng sự trừu tượng mà tôi đã thực hiện chặt chẽ phù hợp với mô hình MVVM.

Vì vậy, đây là lý do tại sao tôi đề xuất mẫu. Nó đơn giản hoá nhiệm vụ thay đổi logic điều khiển giao diện người dùng bằng cách tách nó khỏi giao diện người dùng. Tôi cũng khuyên bạn nên ngừng triển khai nó cho đến khi bạn cần. Có một chi phí để sử dụng MVVM nhưng nó được khấu hao theo chi phí thay đổi logic UI.

1

Without MVVM, mã ứng dụng Silverlight của bạn rất sớm sẽ biến thành mớ hỗn độn không thể quản lý

Các vấn đề liên quan