2013-09-07 40 views
6

Tôi nhầm lẫn về mô hình hoặc mô hình xem và cách đặt tên cho mô hình này.Quy ước đặt tên và mô hình hóa cho Mô hình và Chế độ xemMô hình trong MVVM

Vì mục đích đơn giản, tôi sẽ để lại INotifyPropertyChange trong số đó.

Lớp sau rõ ràng là một mô hình:

class CountryModel 
{ 
    public string Name { get; set; } 
    public string Location { get; set; } 
} 

gì bạn chủ yếu là nhìn thấy trên web là một mô hình điểm sẽ được xác định như sau:

class CountryViewModel 
{ 
    public CountryViewModel 
    { 
     // initialize data (not ideal place, I know, but keeping it simple!) 
    } 

    public ObservableCollection<CountryModel> Countries 
    { 
     private get; 
     set; 
    } 
} 

Tại sao không phải là ở trên ví dụ: Countries, ví dụ: CountriesModel? Tại sao nó được coi là một mô hình xem?

Trường hợp đó có phải là trường hợp kỹ thuật không? Chúng ta có nên có một lớp khác cho mô hình xem không?

class CountryViewModel 
{ 
    private ObservableCollection<CountryModel> _countries = new ....; 

    public CountryViewModel 
    { 

    } 

    public ObservableCollection<CountryModel> Countries 
    { 
     private get { return _countries ?? _countries = LoadCountries(); } 
     set { _countries = value; } 
    } 

    private ObservableCollection<CountryModel> LoadCountries() 
    { 
     ObservableCollection<CountryModel> countries = new ...; 
     foreach (CountryModel country in CountriesModel) 
     { 
      countries.add(country); 
     } 
     return countries; 
    } 
} 

Có phải ý nghĩa trên không? Tôi chỉ không hiểu tại sao nó có vẻ là một tiêu chuẩn và lý do tại sao bạn sẽ gọi CountriesViewModel khi cho tôi nó phải là CountriesModel và một CountryViewModel nên được tạo ra truy cập dữ liệu từ CountriesModel.

Ngoài ra, nếu bạn tuân theo những gì trên web, nghĩa là CountryModelCountryViewModel có chứa bộ sưu tập quan sát CountryModel, thì bạn sẽ đối phó với các quốc gia có chứa mỗi danh sách thành phố như thế nào? Tôi sẽ có CityModel làm POCO và sau đó cho danh sách các thành phố, tôi sẽ tạo một CityViewModel có bộ sưu tập quan sát là CityModel.

Nhưng sau đó sao? Tôi có phải thực hiện phần CityViewModel trong số CountryModel của mình không? Điều đó dường như không đúng chút nào! Có lẽ nó là và ai đó có thể làm rõ điều đó. Đây là nơi tôi bị lẫn lộn nhiều hơn khi tôi đã tạo ra một CountryModel với các thuộc tính Name, Location và thuộc tính loại List<CityModel>, nhưng làm cách nào để trình bày chính xác điều này trong MVVM?

Cách xác định chính xác điều này? Đặc biệt là phần mà bạn có một danh sách các đối tượng và mỗi đối tượng đó chứa một danh sách khác. Đó là một mô hình, một mô hình xem và làm cách nào để xử lý danh sách bên trong mô hình của tôi?

Trả lời

14

Thông thường, mọi người tạo mô hình xem cho mọi chế độ xem họ có trong hệ thống của họ. Mục đích của mô hình khung nhìn là tạo điều kiện thuận lợi cho dữ liệu của khung nhìn. Xem mô hình thường là một phiên bản phẳng của các đối tác mô hình miền của họ, nhưng điều này có vẻ khó hiểu khi bạn có các mô hình miền phẳng thực sự chỉ là các đối tượng chuyển dữ liệu (DTO). Đừng sợ có các mô hình xem gần giống với mô hình miền; chúng là những trừu tượng khác nhau của dữ liệu nhằm mục đích sống và làm việc ở các khu vực/lớp khác nhau của ứng dụng của bạn.

Đối với câu hỏi/ví dụ của bạn, nếu bạn có chế độ xem trong ứng dụng đại diện cho các quốc gia và thành phố theo bản chất phân cấp thì có thể chấp nhận được CountryViewModel được bao gồm CityViewModel. xem các mô hình đã giúp bao gồm dữ liệu cho chế độ xem cụ thể đó. Cũng có thể sử dụng thừa kế trong các mô hình khung nhìn để bạn có thể có lớp mô hình khung nhìn cơ sở chứa thông tin lỗi cho bất kỳ điều gì sai, chẳng hạn như các vấn đề truy xuất dữ liệu, vấn đề ánh xạ dữ liệu hoặc các vấn đề xác thực dữ liệu.

Vì bạn thường muốn có một kiểu xem cho mỗi lần xem trong ứng dụng của mình, bạn nhiều lần kết thúc với một tập hợp các mô hình xem phù hợp với các hoạt động CRUD cho đối tượng mô hình miền của bạn. Ví dụ: giả sử bạn có một mô hình miền Account, thì có thể bạn sẽ có CreateAccountViewModel, DisplayAccountViewModel, DeleteAccountViewModelUpdateAccountViewModel.

Nhiều người quan tâm đến trùng lặp trong mã của họ và nghĩ rằng có một mô hình miền và mô hình xem gần như giống nhau về cấu trúc và kiểu dữ liệu, nhưng hãy nhớ rằng chúng phục vụ các mục đích khác nhau; các mô hình miền tồn tại để tạo điều kiện cho dữ liệu cho không gian vấn đề bạn đang làm việc, trong khi các mô hình xem tồn tại để tạo điều kiện cho dữ liệu hiển thị thông tin cho người dùng trong chế độ xem.

Nó cũng không phải là chưa từng có một lớp mô hình dữ liệu trong một lớp truy cập dữ liệu khác với mô hình miền, nhưng phản ánh cấu trúc của dữ liệu được lấy ra từ một bảng cơ sở dữ liệu. Đây là cách bạn có thể sử dụng micro-ORM như Dapper. Thay vì viết logic ánh xạ ADO.NET DataReader, bạn tạo một lớp mô hình dữ liệu khớp với tên cột trong truy vấn bạn sử dụng để lấy dữ liệu từ cơ sở dữ liệu và sau đó sử dụng lớp đó làm đối tượng để "đổ" dữ liệu vào. Từ đó bạn có thể lập bản đồ logic để xây dựng một lớp mô hình miền được truyền lại các lớp ứng dụng của bạn.

+0

Tôi hiểu những gì bạn đang nói về viewmodel và đó là tốt nhưng tôi vẫn còn bối rối về cách tôi nên đối phó với mô hình miền. Lấy quốc gia làm ví dụ, tôi có nên sử dụng CountryModel và CountriesModel để lưu trữ danh sách các quốc gia của mình không và sau đó tôi có một Quốc giaModel để liên kết Quốc giaModel với chế độ xem của tôi không? – Thierry

+0

Không, bạn không nên có một lớp mô hình miền mà chỉ là một danh sách của một lớp mô hình miền khác; tuy nhiên nếu bạn là một lớp mô hình miền cho phép nhiều giá trị quốc gia, thì bạn nên sử dụng danh sách lớp mô hình miền quốc gia (thành phần). –

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