2009-08-24 39 views
9

Tôi đã bắt đầu một dự án WinForms một vài tuần trước và khi tôi không thực sự biết những tính năng tôi muốn, tôi chỉ cần thêm chúng trên đường đi. Điều này giờ đây gây ra một mớ hỗn độn khủng khiếp khi MainForm của tôi là một quả bóng bùn lớn và ví dụ một số thay đổi trạng thái quan trọng được kích hoạt bởi các phần tử UI đến điểm tôi phải gọi OnChange Event of a Control để thay đổi một số trạng thái trong cơ sở dữ liệu .Kiến trúc cho các ứng dụng WinForms?

Tóm lại: Tôi vừa mới bắt đầu một dự án mới nơi tôi muốn tiếp cận tốt hơn. Tôi chỉ không biết cái nào là "tốt". Trong ASP.net MVC, tôi thấy mẫu MVVM thực sự hữu ích, nhưng trên Desktop, MVVM dường như chỉ dành cho WPF, không dành cho WinForms.

Cách tiếp cận khác là kiến ​​trúc ba tầng: Tôi có Lớp cơ sở dữ liệu của mình hiện đang đàm phán trực tiếp với giao diện người dùng. Bây giờ tôi tạo một lớp tĩnh mới ("ApplicationState") nói chuyện với cơ sở dữ liệu và kích hoạt các sự kiện để nói với giao diện người dùng "Hey, Something changed!". Giao diện người dùng sẽ thao tác Nhà nước mà sau đó sẽ xử lý sự kiên trì cơ sở dữ liệu và một lần nữa nâng cao sự kiện nếu giao diện người dùng cần cập nhật. Điểm ở đây là lớp ApplicationState không bao giờ sửa đổi giao diện người dùng trực tiếp, nhưng giao diện người dùng đăng ký với Sự kiện. Điều đó trông giống như một cách sạch sẽ/"MVC-y" để làm điều đó, nhưng có lẽ tôi đang xem cái gì đó ở đây?

Về cơ bản mục tiêu cuối cùng của tôi là để giao diện người dùng hoàn toàn độc lập khỏi lớp cơ sở dữ liệu chỉ để đảm bảo rằng tôi không dây trong logic nghiệp vụ vào giao diện người dùng một lần nữa.

Trả lời

8

Đừng ném khăn vào MVVM - nó cũng hợp lệ cho WinForms. Về cơ bản, nếu bạn sử dụng ràng buộc dữ liệu, bạn phải đưa ra quyết định về những gì đối tượng của bạn sẽ liên kết. Thông thường, đặc biệt đối với giao diện người dùng phức tạp hơn, bạn không muốn liên kết trực tiếp với các đối tượng miền, bạn muốn xây dựng các lớp chuyên biệt (đôi khi trình bao bọc) mà giao diện người dùng của bạn có thể liên kết để cung cấp mọi thứ cần xem (bản chất của MVVM) và kỹ thuật hoạt động tốt với Winforms.

Một loạt tốt về cách tiếp cận WinForms Model-View-Presenter có thể được tìm thấy tại

The Build Your Own CAB Series Table of Contents

+1

Loạt bài viết đó thực sự tốt, dường như là những gì tôi muốn. –

+0

+1 để giới thiệu chuỗi video trên MVP trong WinForms. – groverboy

4

Những gì tôi sẽ luôn luôn đi cho (đầu tiên) là để có một ứng dụng lớp

  • Presentation Layer (JUST UI và logic databinding)
  • Interface Layer để các lớp Kinh doanh (xác định các hợp đồng để truy cập vào BL)
  • Business lớp thực hiện (logic thực tế, xác nhận dữ liệu vv ...)
  • Interface layer để Data Access layer (xác định các hợp đồng để truy cập vào DAL)
  • Triển khai lớp truy cập dữ liệu

Việc này sắp xếp ứng dụng của bạn rất tốt. Sau đó, tôi sẽ tìm một số cách tiếp cận loại MVC. Tôi đã không phát triển quá nhiều với WinForms, nhiều hơn với Asp.net và một số máy khách Java Desktop (nơi tôi đã sử dụng MVC). WinForms hoạt động nhiều hơn với cách tiếp cận dữ liệu .Net (DataSource, DataMember, ...). Bạn nên đi theo phương pháp đó thay vì cố ép buộc thứ gì đó khác. Tôi thấy rằng nó không phù hợp với điều đó.

Điều luôn hữu ích là đặt logic UI vào các điều khiển khác nhau (như UserControls trong Asp.net). Điều này tạo điều kiện tái sử dụng.

+1

Bạn như lasagna hả? – MusiGenesis

+0

Tôi đoán rằng làm cho. NET pho mát giữa các lớp? –

+0

Lớp phô mai phù hợp với nó ở đâu? Tôi thích phô mát. –

1

Chỉ cần bắt đầu viết các bài kiểm tra đơn vị cho mọi thứ bạn có thể nghĩ đến. Như một số phần sẽ cử tri đi bầu khó khăn để kiểm tra đơn vị vì khớp nối chặt chẽ với WinForms, tách chúng ra. Dọn dẹp. Rửa sạch.

+2

-1 bởi vì đây là cơ bản như thế nào ông đã nhận được một quả bóng lớn của bùn ở nơi đầu tiên, chỉ mà không có các bài kiểm tra đơn vị. – MusiGenesis

+1

@MusiGenesis, "chỉ không có bài kiểm tra đơn vị" - đó là một sự khác biệt. Sự vắng mặt của các bài kiểm tra đơn vị là điều thúc đẩy quả bóng bùn lớn. – zvolkov

+1

Bài kiểm tra đơn vị không có viên đạn ma thuật, theo kinh nghiệm của tôi. Quả bóng bùn kết quả từ việc thêm đồ khi bạn đi, mà không có một kế hoạch rõ ràng trước thời hạn. Một quả bóng bùn với một bộ xét nghiệm kèm theo vẫn là một quả bóng bùn (và đôi khi các xét nghiệm là một quả bóng bùn khác). – MusiGenesis

0

quy tắc của chúng tôi nhỏ là nạc theo hướng MVC đối với hầu hết các trang web do bản chất không quốc tịch của trang web. Trừ khi bạn đang cố gắng cung cấp một trải nghiệm web rất phong phú và mang lại ánh bạc, thì bạn nên đi với MVVM. XAML đi tay với MVVM và có thể là lựa chọn khách hàng thông minh của bạn (hoặc một mẫu MVCP đẹp).

True MVC gần như không thể duy trì trong bất kỳ trường hợp nào khác do thực tế là các bộ điều khiển giả sử xử lý tất cả đầu vào. Hầu hết kiến ​​trúc không phải web đều có các điều khiển sẽ cung cấp cho bạn. Trong thực tế, hầu hết nói rằng ASP.NET MVC là một anyways lai MVC nhưng nó rất tốt trong kinh nghiệm của tôi.

6

Tài liệu NDepend đi kèm với một số bài đăng trên blog, bài viết và sách trắng trực tuyến khá thú vị và nâng cao liên quan đến kiến ​​trúc của mã .NET.

Advices on partitioning code through .NET assemblies

Control Components Dependencies to gain Clean Architecture

Re-factoring, Re-Structuring and the cost of Levelizing

Evolutionary Design and Acyclic componentization

Layering, the Level metric and the Discourse of Method

Fighting Fabricated Complexity

Ngoài ra, nếu bạn muốn tiếp tục kiểm tra xem mã UI của bạn là độc lập từ mã cơ sở dữ liệu của bạn, bạn có thể viết một cách dễ dàng một số quy tắc luật Query Language sẽ được kiểm tra trực tiếp tại thời gian phát triển trong Visual Studio:

Keep your code structure clean

1

Nido framework là tốt. Tuy nhiên nó chỉ dành cho kiến ​​trúc back-end của bạn. Nó sẽ cung cấp cho bạn một back-end vững chắc, linh hoạt và đơn giản hơn với t4template. Nó chứng minh là có một mô hình kiến ​​trúc rất tốt. Hơn nữa nó có thể cắm không chỉ với WinForm nhưng với bất kỳ khác (MVC ASP.NET vv) front-end quá ..

Sau đó, một lần nữa RocketFramework cũng tốt

link1: http://rocketframework.codeplex.com Link2: http://nidoframework.codeplex.com

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