Thực hành tốt về Giải pháp Visual Studio [đã đóng]


10

Hy vọng một câu hỏi tương đối đơn giản. Tôi đang bắt đầu làm việc với một dự án nội bộ mới để tạo ra khả năng dễ điều khiển của các thiết bị được sửa chữa trong các tòa nhà.

Cơ sở dữ liệu được lưu trữ từ xa trên máy chủ web và sẽ được truy cập thông qua API web (đầu ra JSON) và được bảo vệ bằng OAuth. GUI giao diện người dùng đang được thực hiện trong WPF và mã doanh nghiệp trong C #.

Từ đây, tôi thấy các lớp khác nhau Trình bày / Ứng dụng / Kho dữ liệu. Sẽ có mã để quản lý tất cả các lệnh gọi được xác thực tới API, lớp để thể hiện các thực thể (đối tượng kinh doanh), các lớp để xây dựng các thực thể (đối tượng kinh doanh), các bộ phận cho GUI WPF, các bộ phận của chế độ xem WPF, v.v.

Là tốt nhất để tạo điều này trong một dự án duy nhất, hoặc chia chúng thành các dự án riêng lẻ?

Trong thâm tâm tôi nói nó nên là nhiều dự án. Tôi đã thực hiện cả hai cách trước đây và thấy việc thử nghiệm trở nên dễ dàng hơn với một giải pháp dự án duy nhất, tuy nhiên với nhiều dự án thì phụ thuộc đệ quy có thể tăng lên. Đặc biệt là khi các lớp có giao diện để kiểm tra dễ dàng hơn, tôi đã thấy mọi thứ có thể trở nên khó xử.


1
Tôi sẽ tách chúng thành những gì có ý nghĩa cho dự án.
Ramhound

Có ai khác có suy nghĩ gì không, một dự án về việc giữ các giao diện như MattDavey đề xuất. Tôi đã sử dụng phương pháp này trước đây để tránh các phụ thuộc được đề cập. Hoặc các giao diện cho lớp x, ngồi trong cùng một dự án với lớp x.
JonWillis

Ngoài ra, những lớp nào bạn sử dụng tất cả. Tôi đã thấy một vài biến thể khác nhau mặc dù các biến thể chính là Trình bày / Ứng dụng / Cơ sở hạ tầng. Một số cũng chia ứng dụng thành 2 phần, ứng dụng + dịch vụ. Một số mô hình cũng đề cập đến một lớp cụ thể cho logic kinh doanh, mà theo tôi có thể được bao gồm trong chính các đối tượng kinh doanh.
JonWillis

Câu trả lời:


8

Nó phụ thuộc vào quy mô của dự án

Đây là hướng dẫn tôi có xu hướng sử dụng

  • Một dự án nhỏ, với một số ít trang hoặc ít hơn, tôi hầu như luôn giữ một dự án duy nhất.

  • Nếu lớp Truy cập dữ liệu của dự án nhỏ lớn hoặc phức tạp, tôi có thể tách nó ra thành lớp riêng của nó, nhưng nếu không thì nó chỉ nằm trong thư mục riêng của nó.

  • Nếu dự án lớn hơn, hầu như tôi sẽ luôn có một dự án riêng cho DAL và bất kỳ sự phân tách nào nữa phụ thuộc vào ranh giới giữa chức năng của ứng dụng.

  • Nếu ứng dụng có nhiều mục đích, mỗi mục đích có chế độ xem, chế độ xem, v.v., thì tôi thường sẽ tách từng phần vào khu vực riêng của nó. Nếu mỗi phần nhỏ, tôi tách chúng bằng một Thư mục. Nếu mỗi phần lớn, tôi sẽ tách chúng theo một dự án.

  • Nếu tôi có nhiều dự án mà cần phải tham khảo cùng một tập hợp các đối tượng ( ViewModelBase, RelayCommand, vv), tôi sẽ tạo một dự án chỉ dành riêng cho các đối tượng cơ sở hạ tầng dùng chung.

  • Nếu tôi có số lượng lớn các kiểu / mẫu / tài nguyên tùy chỉnh được chia sẻ, tôi sẽ tạo một dự án chỉ dành cho những người đó.

Một ghi chú bên lề, tôi đã phạm sai lầm với dự án WPF lớn đầu tiên của mình và tách chúng ra bằng cách đưa Mô hình vào một dự án, Lượt xem trong dự án khác và ViewModels trong một phần ba. Tôi có thể nói với bạn bây giờ đó không phải là cách để đi, vì bảo trì trở thành một cơn ác mộng :)


Tò mò, bạn đã có những vấn đề bảo trì nào bằng cách tách các lớp?
Ian

@Rachel, tôi sẽ sử dụng WPF. Vì vậy, sẽ được quan tâm để biết làm thế nào bạn tổ chức dự án sau đó kết thúc. Tôi nghĩ rằng tôi có thể nhớ một dự án MVC nhỏ là một nỗi đau khi tách 3 phần thành 3 dll. Đối với WPF, Chế độ xem của tôi sẽ là GUI, đối tượng thực thể / doanh nghiệp sẽ được thay đổi và ViewModel tương tác giữa chúng. ViewModel sẽ xử lý logic của việc gọi một kho lưu trữ để tải / lưu các sửa chữa (do đó có các nhà máy / web apis, v.v.).
JonWillis

1
@Ian Vấn đề lớn nhất là hầu hết các thay đổi nhỏ, chẳng hạn như thêm một trường duy nhất, yêu cầu tôi phải tìm kiếm Model, View, ViewModel và DAL trong 4 thư viện riêng biệt. Dự án tôi đang làm lúc đó khá lớn và tôi đã lãng phí nhiều thời gian hơn là tôi quan tâm đến việc tìm kiếm các tập tin cụ thể. Kể từ đó tôi đã thay đổi để giữ các đối tượng có liên quan với nhau, ví dụ như vậy bất cứ điều gì Tìm kiếm liên quan đến như SearchView, SearchViewModelSearchResultModeltất cả sẽ được nhóm lại với nhau trong một thư mục và tôi đã tìm thấy nó làm cho các ứng dụng dễ dàng hơn để duy trì.
Rachel

@ Tôi cũng nhớ lại có vấn đề phụ thuộc và chạy vào các tham chiếu vòng tròn, bởi vì mặc dù tôi đã cố gắng hết sức nhưng một số lớp cần để tham chiếu các lớp khác, nhưng lớp đó đã tham chiếu chúng, vì vậy tôi đã có một số cách giải quyết xấu xí cho đến khi tôi tái cấu trúc
Rachel

1
@JonWillis Hầu hết các dự án WPF của tôi được chia ra dựa trên các điểm được chỉ định trong câu trả lời của tôi. Thông thường, DAL là lớp riêng của nó và mỗi Mô-đun hoặc Phần của dự án được nhóm lại với nhau (trong thư mục, không gian tên hoặc dự án riêng của nó tùy thuộc vào kích thước của dự án). Vì vậy, ví dụ, tất cả các Đối tượng tìm kiếm sẽ ở cùng nhau, bao gồm cả Interfacelớp dữ liệu, nhưng lớp truy cập dữ liệu thực tế cho Tìm kiếm sẽ nằm trong thư viện DAL. Tôi thường có một Infrastructurehoặc một Commonthư viện chứa các lớp cơ sở, giao diện và các lớp trợ giúp chung.
Rachel

14

Tôi đã thấy kết quả tốt nhất với một dự án trên mỗi lớp, cộng với dự án thử nghiệm trên mỗi lớp. Tôi đã thấy một vài ứng dụng không thể hoàn thành trong 10 dự án hoặc ít hơn trong giải pháp, trong đó giải pháp bao gồm mọi thứ .

Đừng rơi vào cái bẫy của việc sử dụng các dự án mà bạn thực sự muốn đặt tên. Hàng tấn dự án không thêm gì ngoài chi phí không có lợi.


9

IMHO tách biệt hầu như luôn luôn tốt hơn. Tôi hầu như luôn tách biệt lớp dữ liệu của mình trừ khi dự án là 100% tầm thường. Lý do là bởi vì lớp dữ liệu có xu hướng được truyền xung quanh thường xuyên nhất. Hiếm khi bạn kết nối GUI với nhiều lớp dữ liệu và mong đợi nó hoạt động tốt. Kịch bản phổ biến hơn nhiều là bạn có một lớp dữ liệu duy nhất và bạn muốn nó được phân phối trên nhiều GUI (ví dụ: ASP.Net, WPF và ứng dụng Silverlight). Thật tuyệt vời khi bạn chỉ có thể xây dựng dự án lớp dữ liệu và đưa dll đó làm tham chiếu trong GUI tiếp theo mà bạn xây dựng.


+1 Khi tôi bắt đầu các dự án mới, tôi thường xây dựng một lớp dữ liệu mô phỏng chứa dữ liệu trong bộ nhớ. Cho phép tôi tiếp tục xây dựng phần còn lại của ứng dụng trước. Sau đó tôi có thể trao đổi nó ra một lớp truy cập dữ liệu "thực" sau ..
MattDavey

Bạn có xem xét các thực thể (DTO), nhà máy và các lớp được sử dụng để giao tiếp với máy chủ web tất cả các phần của lớp dữ liệu không?
JonWillis

@JonWillis - Không, có lẽ không phải tất cả. Tôi sẽ đặt các nhà máy và các lớp cho máy chủ web trong một không gian tên của một dự án thư viện lớp. Lớp dữ liệu điển hình của tôi không chứa gì ngoài các tệp dbml cần thiết và / hoặc các tệp edmx. Tuy nhiên, theo quy định, tôi cung cấp cho "thư viện / khung" công cụ dự án riêng của họ. Họ chắc chắn không cần phải tham gia vào dự án GUI, mặc dù tôi thấy mọi người làm điều đó mọi lúc.
Morgan Herlocker

Trên thực tế, bạn sẽ mất bao lâu để có một vài không gian tên và phân nhánh chúng vào một dự án mới. Tôi cảm thấy đó là một công việc tái cấu trúc khá dễ dàng.
Didier A.

4

Đối với tôi, 4 * là con số kỳ diệu. Một dự án cho mỗi lớp và một dự án xác định tất cả các giao diện / DTO cần thiết để giao tiếp giữa chúng.

* 7 nếu bạn đếm bài kiểm tra đơn vị


2

Tôi đã luôn sử dụng một giải pháp duy nhất nếu tôi đang làm việc trên các lớp khác nhau đó hoặc nếu có sự liên kết chặt chẽ với chúng. Tôi muốn đạt F5 và có tất cả các dự án được xây dựng lại nếu cần. Tôi không nghĩ có một cách "đúng" để làm điều đó.


2

Hương vị cá nhân của nó, điều quan trọng nhất là phải nhất quán . Cá nhân tôi có một dự án tách riêng cho từng lớp của ứng dụng nên sự tách biệt là rõ ràng.


Những lớp nào bạn tách xuống? Bạn có các lớp Ứng dụng / Dịch vụ riêng biệt không và nếu có thì chúng thực sự khác nhau như thế nào. Là logic kinh doanh của bạn có trong ứng dụng / dịch vụ hay chúng là các phương thức trên các đối tượng kinh doanh thực tế?
JonWillis

1

Sự gia tăng số lượng dự án phải làm với việc cho phép thử nghiệm đơn vị và đơn giản hóa biểu đồ phụ thuộc đến mức mọi thứ không phức tạp đến mức thay đổi trong một phần của ứng dụng phá vỡ mọi thứ trong các phần dường như không liên quan của ứng dụng.

Nó hoạt động khi tôi thực hiện một số loại đảo ngược phụ thuộc, để đặt tất cả các "hợp đồng", giao diện, lớp trừu tượng, đối tượng truyền dữ liệu vào một cụm. Trong một hội nghị khác, tôi đặt bất cứ điều gì nói về cơ sở dữ liệu. Kiểm tra đơn vị có được lắp ráp riêng của họ. Nếu UI về cơ bản là không thể kiểm chứng được (ví dụ như win win của ASP.NET), thì có thể có lợi ích đáng kể khi chia UI thành mã có thể kiểm tra và mã không thể kiểm tra - mỗi cụm. Đôi khi một số mã bắt đầu hiển thị không liên quan gì đến cơ sở dữ liệu, giao diện người dùng hoặc bất cứ điều gì tôi đã đề cập cho đến nay - đó là mã mà tôi mong muốn nằm trong khung .NET. Mã đó tôi sẽ đưa vào một hội đồng tiện ích, hoặc ít nhất là đặt nó vào bất cứ tập hợp gốc nào (có thể là mã có giao diện.

Nếu tất cả các hội đồng tham chiếu tất cả các hội đồng, hoặc gần như vậy, thì chúng nên được hợp nhất trở lại thành một hội đồng duy nhất. Nếu bạn hoặc những người trong nhóm của bạn thiếu kỷ luật để không đặt mã lớp dữ liệu vào UI và UI trong lớp dữ liệu, thì hãy đơn giản hóa mọi thứ bằng cách hợp nhất tất cả lại thành một lớp.

Một số phiên bản của Visual Studio gặp vấn đề về hiệu năng ở khoảng 15 hội đồng, đôi khi nó phụ thuộc vào loại dự án nào. Chiến lược dỡ tập tin dự án đôi khi có thể giúp đỡ mặc dù.


Hiện tại tôi là nhà phát triển duy nhất tại công ty. Và cũng mới ra trường, vì vậy cố gắng thấm nhuần các thực tiễn tốt, vào các dự án lớn hơn càng sớm càng tốt. Tôi quan tâm đến việc làm cho nó có thể duy trì được vì đặc tả hệ thống đã thay đổi rất nhiều trước khi tôi bắt đầu viết tài liệu, chống lại các yêu cầu muốn hệ thống càng sớm càng tốt. Theo bạn, sẽ có một hội đồng chỉ chứa các giao diện là một giải pháp phù hợp? Theo cách đó, sự phụ thuộc chỉ nên có trên các giao diện và các lớp của nhà máy.
JonWillis

1
Đúng. Tốt hơn là nên hiểu động cơ của việc chia tách lắp ráp, nhưng nếu bạn (hoặc các thành viên trong nhóm của bạn) không mò mẫm nó, thì đó vẫn là một thao tác không tốn kém. Vì vậy, ngay cả khi bạn kết thúc với tất cả các hội đồng phụ thuộc vào tất cả các hội đồng và không hy vọng thử nghiệm đơn vị, việc chuyển những thứ hoạt động như hợp đồng (giao diện, lớp trừu tượng) sang lắp ráp riêng của chúng, là một bước đi đúng hướng và có một vài nhược điểm.
MatthewMartin

-2

Lý do chính đáng duy nhất để có nhiều hơn một dự án, là nếu bạn cần chia sẻ một tập hợp các lớp và tệp trên nhiều ứng dụng.

Nếu các dự án chỉ được sử dụng bởi một ứng dụng, thì chúng không nên được thực hiện ngay từ đầu. Sử dụng không gian tên thay thế. Hãy tự cứu mình khỏi những rắc rối của tài liệu tham khảo vòng tròn, chi phí dll và sự nhầm lẫn của dự án khi tìm kiếm tệp.

Đọc bài viết này để được giải thích rõ hơn về lý do tại sao lại như vậy: http://lostechies.com/chadmyers/2008/07/16/project-anti-potype-many-projects-in-a-visual-studio- tập tin giải pháp /

Và như bài báo nêu, tôi hoan nghênh bất kỳ ai có lý do hợp lệ để có nhiều dự án ngoài việc chia sẻ mã trên ứng dụng để cho tôi biết đó là gì, vì tôi nghi ngờ không có dự án nào.


Đối số truy cập trên downvote sẽ được đánh giá cao.
Didier A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.