MVVM - Câu hỏi phỏng vấn

Model, View, ViewModel (MVVM pattern) là tất cả về việc hướng dẫn bạn cách tổ chức và cấu trúc mã của bạn để viết các ứng dụng có thể bảo trì, có thể kiểm tra và có thể mở rộng.

Model - Nó chỉ đơn giản là giữ dữ liệu và không liên quan đến bất kỳ logic kinh doanh nào.

ViewModel - Nó hoạt động như liên kết / kết nối giữa Model và ViewModel, và làm cho mọi thứ trông đẹp mắt.

View - Nó chỉ đơn giản là giữ ngày đã định dạng và về cơ bản ủy thác mọi thứ cho Model.

Lợi ích chính là cho phép tách biệt thực sự giữa Chế độ xem và Mô hình ngoài việc đạt được sự tách biệt và hiệu quả mà bạn đạt được khi có điều đó. Điều đó có nghĩa là trong điều kiện thực tế là khi mô hình của bạn cần thay đổi, nó có thể được thay đổi dễ dàng mà không cần chế độ xem và ngược lại.

Có ba điều quan trọng khi áp dụng MVVM -

  • Maintainability
  • Testability
  • Extensibility
  • Một số người nghĩ rằng đối với giao diện người dùng đơn giản, MVVM có thể là một sự quá mức cần thiết.
  • Tương tự như vậy trong các trường hợp lớn hơn, có thể khó thiết kế ViewModel.
  • Gỡ lỗi sẽ hơi khó khăn khi chúng ta có các ràng buộc dữ liệu phức tạp.

Nói chung, mô hình là mô hình đơn giản nhất để hiểu. Đây là mô hình dữ liệu phía máy khách hỗ trợ các khung nhìn trong ứng dụng.

  • Nó bao gồm các đối tượng có thuộc tính và một số biến để chứa dữ liệu trong bộ nhớ.

  • Một số thuộc tính đó có thể tham chiếu đến các đối tượng mô hình khác và tạo ra biểu đồ đối tượng mà tổng thể là các đối tượng mô hình.

  • Đối tượng mô hình nên nâng cao thông báo thay đổi thuộc tính mà trong WPF có nghĩa là liên kết dữ liệu.

  • Trách nhiệm cuối cùng là xác thực là tùy chọn, nhưng bạn có thể nhúng thông tin xác thực vào các đối tượng mô hình bằng cách sử dụng các tính năng xác thực liên kết dữ liệu WPF thông qua các giao diện như INotifyDataErrorInfo / IDataErrorInfo.

Mục đích và trách nhiệm chính của khung nhìn là xác định cấu trúc của những gì người dùng nhìn thấy trên màn hình. Cấu trúc chứa phần tĩnh và phần động.

  • Phần tĩnh là cấu trúc phân cấp XAML xác định các điều khiển và cách bố trí các điều khiển mà một dạng xem bao gồm.

  • Phần động giống như hoạt ảnh hoặc thay đổi trạng thái được xác định là một phần của Chế độ xem.

  • Mục tiêu chính của MVVM là không có mã phía sau trong chế độ xem.

  • Theo quan điểm này, bạn cần ít nhất hàm tạo và một lệnh gọi để khởi tạo thành phần.

  • Mã logic xử lý sự kiện, hành động và thao tác dữ liệu không được nằm trong mã phía sau trong Chế độ xem.

  • Ngoài ra còn có các loại mã khác phải đi trong mã đằng sau bất kỳ mã nào bắt buộc phải có tham chiếu đến phần tử giao diện người dùng. Nó vốn dĩ là mã xem.

  • ViewModel là điểm chính của ứng dụng MVVM. Trách nhiệm chính của ViewModel là cung cấp dữ liệu cho chế độ xem, để chế độ xem đó có thể đưa dữ liệu đó lên màn hình.

  • Nó cũng cho phép người dùng tương tác với dữ liệu và thay đổi dữ liệu.

  • Trách nhiệm chính khác của ViewModel là đóng gói logic tương tác cho một chế độ xem, nhưng điều đó không có nghĩa là tất cả logic của ứng dụng phải đi vào ViewModel.

  • Nó sẽ có thể xử lý trình tự các cuộc gọi thích hợp để thực hiện điều đúng đắn xảy ra dựa trên người dùng hoặc bất kỳ thay đổi nào trên chế độ xem.

  • ViewModel cũng nên quản lý bất kỳ logic điều hướng nào như quyết định thời điểm điều hướng đến một chế độ xem khác.

Có hai cách để xây dựng khung nhìn. Bạn có thể sử dụng bất kỳ một trong số chúng.

  • Xem công trình đầu tiên trong XAML
  • Xem công trình đầu tiên ở phần sau mã

Một cách là chỉ cần thêm ViewModel của bạn dưới dạng một phần tử lồng nhau trong bộ thiết lập cho thuộc tính DataContext như được hiển thị trong đoạn mã sau.

<UserControl.DataContext> 
   <viewModel:StudentViewModel/> 
</UserControl.DataContext>

Một cách khác là bạn có thể thực hiện xây dựng chế độ xem đầu tiên bằng cách chỉ cần tự xây dựng mô hình chế độ xem trong mã phía sau Chế độ xem của bạn bằng cách đặt thuộc tính DataContext ở đó với phiên bản.

Thông thường, thuộc tính DataContext được đặt trong phương thức xây dựng của chế độ xem, nhưng bạn cũng có thể trì hoãn việc xây dựng cho đến khi sự kiện Tải của chế độ xem kích hoạt.

using System.Windows.Controls;

namespace MVVMDemo.Views { 
   /// <summary> 
      /// Interaction logic for StudentView.xaml 
   /// </summary> 
	
   public partial class StudentView : UserControl { 
      public StudentView() { 
         InitializeComponent(); 
         this.DataContext = new MVVMDemo.ViewModel.StudentViewModel(); 
      } 
   } 
}

Lý do chính của việc xây dựng ViewModel trong mã phía sau thay vì XAML là hàm tạo mô hình xem nhận các tham số, nhưng phân tích cú pháp XAML chỉ có thể xây dựng các phần tử nếu được định nghĩa trong hàm tạo mặc định.

ViewModelLocator cung cấp một cách chuẩn, nhất quán, có tính khai báo và được kết hợp lỏng lẻo để thực hiện việc xây dựng chế độ xem đầu tiên tự động hóa quá trình kết nối ViewModel với Chế độ xem. Sau đây là quy trình cấp cao của ViewModelLocator.

  • Tìm ra loại Chế độ xem nào đang được xây dựng.
  • Xác định ViewModel cho loại View cụ thể đó.
  • Tạo ViewModel đó.
  • Đặt View DataContext thành ViewModel.

Liên kết dữ liệu là tính năng chính giúp phân biệt MVVM với các mẫu phân tách giao diện người dùng khác như MVC và MVP.

Liên kết dữ liệu có thể là OneWay hoặc TwoWay để chuyển dữ liệu qua lại giữa View và ViewModel.

Mẫu dữ liệu ngầm định có thể tự động chọn một mẫu thích hợp từ từ điển tài nguyên hiện tại cho một phần tử sử dụng liên kết dữ liệu. Chúng thực hiện điều này dựa trên loại đối tượng dữ liệu được hiển thị bằng cách liên kết dữ liệu. Trước tiên, bạn cần có một số phần tử liên kết với một đối tượng dữ liệu.

Có hai tác nhân chính, người gọi và người nhận trong Command pattern.

Invoker

Invoker là một đoạn mã có thể thực thi một số logic mệnh lệnh. Thông thường, nó là một phần tử giao diện người dùng mà người dùng tương tác với trong ngữ cảnh của khung giao diện người dùng. Nhưng nó chỉ có thể là một đoạn mã logic khác ở đâu đó trong ứng dụng.

Receiver

Bộ nhận là logic được thiết kế để thực hiện khi kẻ gọi tên bắn ra. Trong ngữ cảnh của MVVM, bộ thu thường là một phương thức trong ViewModel của bạn cần được gọi.

Giữa người gọi và người nhận, bạn có một lớp vật cản không cho phép người gọi và người nhận biết rõ ràng về nhau. Điều này thường được biểu diễn dưới dạng một giao diện trừu tượng tiếp xúc với người gọi và một triển khai cụ thể của giao diện đó có khả năng gọi người nhận.

Không, nếu phần nội dung chỉ cung cấp cấu trúc để hiển thị nội dung nào đó lên màn hình và không hỗ trợ bất kỳ đầu vào hoặc thao tác nào của người dùng đối với nội dung đó. Nó có thể không cần một ViewModel riêng biệt, nhưng nó có thể chỉ là một đoạn XAML hiển thị dựa trên các thuộc tính được hiển thị bởi ViewModel cha mẹ.

Khi ứng dụng của bạn bắt đầu chấp nhận đầu vào dữ liệu từ người dùng cuối, bạn cần xem xét xác thực đầu vào đó. Để đảm bảo rằng nó phù hợp với yêu cầu tổng thể của bạn.

Bạn có thể sử dụng các cách sau đây để thể hiện xác thực được hỗ trợ bởi liên kết dữ liệu WPF:

  • Đặt ngoại lệ cho một thuộc tính.
  • Triển khai giao diện IDataErrorInfo.
  • Triển khai INotifyDataErrorInfo.
  • Sử dụng các quy tắc xác thực WPF.

Inversion of Control (IoC) và chèn phụ thuộc là hai mẫu thiết kế có liên quan chặt chẽ với nhau và vùng chứa về cơ bản là một đoạn mã cơ sở hạ tầng thực hiện cả hai mẫu này cho bạn. Mẫu IoC là về việc ủy ​​quyền trách nhiệm xây dựng và mẫu chèn phụ thuộc là về việc cung cấp các phụ thuộc cho một đối tượng đã được xây dựng.

Sự kiện là một cấu trúc lập trình phản ứng với sự thay đổi trạng thái, thông báo cho bất kỳ điểm cuối nào đã đăng ký thông báo. Chủ yếu, các sự kiện được sử dụng để thông báo cho người dùng nhập thông qua chuột và bàn phím, nhưng tính hữu ích của chúng không chỉ giới hạn ở đó. Bất cứ khi nào thay đổi trạng thái được phát hiện, có lẽ khi một đối tượng đã được tải hoặc khởi tạo, một sự kiện có thể được kích hoạt để cảnh báo cho bất kỳ bên thứ ba nào quan tâm.