2009-04-13 20 views
8

Khi sử dụng .NET RIA Services và MVVM trong Silverlight 3.0 có sự khác biệt nào giữa loại Siêu dữ liệu từ RIA Services và ViewModel từ mẫu MVVM không? Có phải những điều này giống nhau hay chúng nên được tách biệt?Kết hợp .NET RIA Services và MVVM trong Silverlight 3.0

Loại siêu dữ liệu là lớp nội bộ được đóng kín cho lớp Thực thể một phần. Dường như không có sự tách biệt thích hợp ở đó nhưng loại siêu dữ liệu cũng có thể được trang trí với các thuộc tính để xác thực mà làm cho nó trông giống như một ViewModel.

Tôi đã tìm kiếm xung quanh nhưng tôi không thấy bất kỳ điều gì nói về điều này một cách chi tiết.

Trả lời

11

Đồng ý với ChuckJ - thường DomainContext là một phần của mô hình xem. Ví dụ: giả sử tôi có trang tìm kiếm cho phép tìm kiếm danh mục sản phẩm. Dưới đây là cách tôi muốn cấu trúc điều:

Trên máy chủ:

class Catalog : DomainService { 
    IQueryable<Product> GetProducts(string keyword) { ... } 
} 

Các tạo DomainContext:

class Catalog : DomainContext { 
    EntityList<Product> Products { get; } 
    void LoadProducts(string keyword); 
} 

Quan điểm mô hình tôi sẽ viết:

class SearchViewModel { 
    Catalog _catalog = new Catalog(); 

    public IEnumerable<Product> Results { 
     get { return _catalog.Products; } 
    } 

    public void Search(string keyword) { 
     _catalog.Products.Clear(); 
     _catalog.LoadProducts(keyword); 
    } 
} 

Và sau đó cuối cùng trong xaml của tôi, tôi đã thiết lập DataContext của UserControl là một thể hiện của SearchViewModel, và ràng buộc một ItemsContr ol đến thuộc tính Results. Tôi muốn sử dụng mẫu ViewModel mà bạn chọn để liên kết một nút bấm để tìm kiếm (đó là một lệnh hiệu quả mà SearchViewModel cho thấy). Cá nhân tôi thích một cái gì đó mà tôi đã làm việc với Silverlight.FX như trong:

<Button Content="Search" 
    fxui:Interaction.ClickAction="$model.Search(keywordTextBox.Text)" /> 

và như ban đầu cho thấy here.

Như Chuck đề cập đến tôi thực sự có thể có trạng thái khác trong mô hình xem của tôi, ví dụ, SelectedProduct có thể là hai chiều ràng buộc với SelectedItem của một ListBox trong xaml của tôi, và sau đó ràng buộc cùng SelectedProduct như DataContext của một DataForm để hiển thị chi tiết của một sản phẩm được chọn.

Hy vọng điều đó sẽ hữu ích! Tôi sẽ viết blog về điều này một số chi tiết trên số blog của tôi sớm.

+0

Sau một vài suy nghĩ trong tuần qua, tôi nghĩ đây là những gì tôi đang nghĩ. DomianContext không phải là ViewModel hoàn chỉnh mà là một phần của nó.Các thuộc tính được định nghĩa trong MetadataType của DomainService (như [Bắt buộc]) phải redeclared trong ViewModel hay thực tế là DomainContext là một phần của ViewModel, đủ để được nhận bởi công cụ xác nhận không? –

+0

Liên kết tới bài đăng trên blog của Nikhil về chủ đề: http://www.nikhilk.net/Entry.aspx?id=229 –

+0

Thuộc tính siêu dữ liệu [Bắt buộc] vv nằm trên các loại thực thể - chứ không phải trên chính mô hình chế độ xem. Chúng sẽ được chọn nếu bạn trưng ra một thể hiện của thực thể từ mô hình khung nhìn (ví dụ: Các sản phẩm trong mẫu mô hình khung nhìn ở trên). –

1

Ngữ cảnh dữ liệu dịch vụ RIA được thiết kế để đóng vai trò của ViewModel trong mẫu MVVM vì chúng hỗ trợ ràng buộc dữ liệu, nhưng chúng không sử dụng thuật ngữ đó trong tài liệu của chúng. Tuy nhiên, nó thực sự phụ thuộc. Có thể bạn sẽ cần trạng thái trong mô hình khung nhìn của mình hơn là ngữ cảnh dữ liệu RIA cung cấp như các lệnh và trạng thái liên quan của khung nhìn khác. Tôi nghĩ rằng những gì bạn muốn làm là sử dụng các ngữ cảnh dữ liệu từ các dịch vụ RIA như một phần của mô hình khung nhìn.

+0

Càng xem xét kỹ, tôi nghĩ mình muốn ẩn EntityObject và MetaDataType càng nhiều càng tốt. Tôi nghĩ rằng bạn là đúng mà tôi có thể muốn DataContext trong ViewModel nhưng tôi cũng muốn loại bỏ các lớp nội bộ MetaData từ EntityObject và di chuyển nó vào ViewModel. Chính xác? –

+0

Đợi đã. Điều đó cũng không đúng. Tôi nghĩ rằng lớp MetaData cần phải ở phía máy chủ và ViewModel trên Máy khách. Ugh. Có lẽ ViewModel thuộc về mã Được chia sẻ? –

+0

Sau khi xem xét câu trả lời sáng nay tôi cuối cùng đã nhận ra bạn đã trả lời câu hỏi này. Chào Chuck, lâu rồi không gặp. Hi vọng dạo nay bạn vân ổn. –

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