2009-05-14 29 views
6

Tôi đang tạo một khung công tác WPF/MVVM để tạo mã cho các lớp mô hình.Các đặc tính tốt nhất của khung công tác datalayer cho các ứng dụng WPF/MVVM là gì?

tôi đang lập kế hoạch để có cho mỗi cơ sở dữ liệu bảng/web-dịch vụ (ví dụ: "Customers") hai lớp mô hình:

  • một mô hình lớp học ít (ví dụ: "Khách hàng")
  • và một lớp mô hình số nhiều (ví dụ: "Khách hàng")

các số ít model class có tất cả các thuộc tính của nó (FirstName, LastName, vv) cộng với tất cả các phương pháp mà nó có ý nghĩa cho một singula ví dụ r, ví dụ: Lưu(), Xóa(), Tính toánSalary(), v.v.

Mô hình số nhiều có một bộ sưu tập các đối tượng mô hình số ít, cùng các phương pháp vì bạn cũng muốn thực hiện trên một nhóm đối tượng đơn lẻ ví dụ Lưu(), Xóa(), CalculateSalary(), nhưng cũng có các phương thức cụ thể như Sort() và các phương thức giúp dễ dàng cho các nhóm nhất định, ví dụ: LoadAllGoldCustomers(), hoặc thậm chí LoadWithSql (string sql) vv

tôi đã thực hiện một khuôn khổ như thế này trước (PHP) và nó làm cho rất dễ dàng để viết và hiểu mã như thế này:

Customers customers = new Customers("all"); 
customers.CalculateSalary(); 

lớp một cặp vợ chồng được thừa kế (khoản và Items) mất hầu hết các mã ra khỏi lớp học ít và số nhiều cá nhân cho mỗi bảng cơ sở dữ liệu, làm cho một môi trường rất sạch sẽ để chương trình trong.

Tuy nhiên, tôi đã hiếm thấy khác các ứng dụng thực hiện việc này phân chia lớp mô hình số ít/số nhiều. Thay vào đó, hầu như luôn có một lớp cho mỗi bảng cơ sở dữ liệu, ví dụ: Customer và lớp này có bất kỳ phương pháp số nhiều nào cần thiết, ví dụ: GetCustomers (string sql) vv

Tôi chỉ nhận thấy trong WPF Model-View-ViewModel Toolkit 0.1 hương, họ có bạn thực hiện hai mô hình của họ "mô hình" thư mục hai lớp:

  • Customer.cs (chỉ lĩnh vực)
  • (phương pháp một Danh sách Load()) CustomersDataSource.cs

nào có vẻ là một khái niệm tương tự, chỉ là lớp "số nhiều" được gọi là một DataSource.

Vì vậy, bây giờ tôi sắp thực hiện một khung công tác khác dựa trên WPF/MVVM và có thể quyết định cách tôi muốn cấu trúc các lớp mô hình. Tôi muốn khuôn khổ để được:

  • rõ ràng và dễ dàng để chương trình chống lại từ ViewModel, vì thế mà tách biệt rõ ràng các lớp mô hình ít và số nhiều, bạn nên chỉ phải thuyết minh một lớp ít hoặc số nhiều và gọi một phương pháp trên đó và bạn có dữ liệu của mình.
  • phù hợp tốt với các mô hình MVVM (mà tôi hiểu phương tiện để giữ như đơn giản càng tốt, chỉ cần có tài sản và phương pháp mà các ViewModel có thể gọi điện thoại, nhưng thực hiện không có tính năng WPF cụ thể như INotifyProperityChanged)
  • muốn datalayer của tôi để ngồi trên bất kỳ nguồn dữ liệu, vì vậy nếu tôi sử dụng LINQ-to-SQL, tôi vẫn gọi các lớp mô hình của riêng mình, và nếu tôi muốn chuyển sang lưu trong Oracle, tôi viết lớp bộ điều hợp dữ liệu thấp hơn cho các lớp của mình tương tác với điều đó.
  • tận dụng lợi thế của LINQ theo cách tốt nhất có thể

tôi sẽ đánh giá cao thông tin phản hồi từ những người đã phát triển datalayers cho các khuôn khổ đặc biệt là sử dụng WPF/MVVM/Composite Thư viện ứng dụng và những đặc điểm bạn tìm thấy làm việc tốt nhất, hoặc nếu bạn đã làm việc với các khung công tác khác như CSLA, Subsonic, vv Ngoài ra, bất kỳ trải nghiệm hoặc ý tưởng nào về cách LINQ thay đổi/đơn giản hóa việc xây dựng cấu trúc datalayer. Cảm ơn.

Trả lời

3

Wow. Đó là một câu hỏi khó trả lời mà không có một ngày để ngồi xuống và nói chuyện với bạn. Nhưng ở đây đi một phiên bản rút ngắn anyway.

Trước tiên, cố gắng chuyển một khuôn khổ hoặc bất kỳ đặc điểm nào của khuôn khổ đó từ ngôn ngữ này sang ngôn ngữ khác có vẻ như đang cố gắng đẩy một chốt hình vuông vào lỗ tròn. Mặc dù tôi không nghi ngờ rằng các tính năng (ví dụ: khách hàng và khách hàng) có thể được chuyển, nhưng tôi có thể cho rằng chúng không nên được chuyển. Gắn bó với sơ đồ customer.CalculateSalary, bạn có thể sử dụng .NET và tạo một phương thức mở rộng cho IEnumerable đã làm điều tương tự, loại bỏ sự cần thiết cho lớp khách hàng đó. Tôi nhận ra bạn có thể có các tính năng khác nữa, nhưng đó chỉ là một ví dụ. Một ví dụ khác là sử dụng LINQ để sắp xếp IEnumerable.

Thứ hai, cá nhân tôi nhận thấy rằng có các phương pháp kiên trì (ví dụ: Lưu, Xóa, v.v.) bên trong đối tượng không hoạt động tốt trong hệ thống lớn, đặc biệt khi xử lý WCF. Dường như nó hoạt động tốt hơn trong các tình huống này để sử dụng một số loại kho lưu trữ sau này, có vẻ như nó cũng sẽ chơi tốt với điểm chuyển đổi của bạn sang Oracle ở giữa phát triển.

Tôi cũng muốn hoàn toàn không đồng ý với bạn về viên đạn về việc lắp ghép tốt vào MVVM. Đối với tôi, mô hình xem là keo giữa mô hình và khung nhìn. Nó không chỉ có khả năng là mô hình xem sẽ cần phải biết về khung nhìn (do đó, các tính năng cụ thể của WPF), nhưng mong muốn nó biết về nó. ICommand là một giao diện quan trọng cho mô hình khung nhìn để biết, và là một trong các hội đồng WPF-y (WindowsBase, PresentationCore, PresentationFramework, không thể nhớ cái nào). Ngoài ra, INotifyPropertyChanged cũng rất quan trọng để ràng buộc dữ liệu và nên được thực hiện trong tất cả các mô hình xem, và không có gì để làm với WPF (đến từ System.ComponentModel tôi nghĩ?).

Đó là hai xu của tôi. Một lần nữa, thật khó để giải thích điều này trong một câu trả lời ngắn cho câu hỏi của bạn. Tôi sẽ khuyên bạn nên sử dụng các mô hình trong một thời gian trước khi thực hiện một khuôn khổ cho nó. Chúc may mắn!

+0

+1 vì bạn đã chỉ ra rằng các phương thức bền vững không hoạt động tốt bên trong đối tượng và các PONO (các đối tượng thuần cũ thuần túy, (cũng POCO, các đối tượng CLR cũ)) có thể được sử dụng thay thế. – tobsen

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