2013-06-07 102 views
11

Tôi có một giải pháp khá lớn về các dự án C# trong Visual Studio. Tôi muốn chuyển một số dự án đó sang làm việc trong MONO và chạy trên MAC. Tất nhiên một số thứ không hoạt động và một số thứ tôi không muốn chuyển vì chúng không được áp dụng trên MAC.Cách tiêu chuẩn công nghiệp để tổ chức các dự án Visual Studio và mã cho .NET là gì? Phát triển đa nền tảng

Một cách tiếp cận là Giải pháp và Cấu hình dự án. Điều này cho phép tôi loại trừ các dự án mà tôi không muốn xây dựng (tiếc là Visual Studio không làm cho dễ dàng nhìn thấy được nhưng dù sao ...).

Cách tiếp cận thứ hai có thể làm việc song song với cách thứ nhất là sử dụng các chỉ thị trình biên dịch trước như #if MONO và sau đó thực hiện điều gì đó tại điểm đó. Điều này là tốt nhưng sau đó nó tạo ra nhiều phiên bản của cùng một hội đồng. Làm thế nào để phân biệt hai từ mỗi biên dịch bài khác? Đây co phải vân đê?

Ngay cả khi hai phương pháp tiếp cận hàng đầu hoạt động, đôi khi tôi muốn một phần của một dự án lớn. Tôi không muốn trải qua 20 tập tin như vậy và đặt #if MONO phải không? Tôi có thể highjack các tập tin dự án bằng tay nhưng không có tầm nhìn về bất cứ điều gì trong studio trực quan. Không ai khác trong nhóm có thể biết điều gì đang xảy ra trừ khi họ dỡ bỏ dự án và mở XML và xem xét. Điều này nghe khá điên rồ. Để làm cho mọi thứ trở nên tồi tệ hơn, đôi khi dự án tham chiếu một cái gì đó và tôi muốn loại bỏ tham chiếu cho MONO. Bây giờ tôi phải chỉnh sửa csproj.

Tôi có thể chia dự án, nhưng nếu vào thời điểm nào đó tôi muốn chuyển sang một nền tảng khác. Các giao điểm của nền tảng nào cần mã nào có thể phát điên. Để làm cho mọi thứ tồi tệ hơn, tôi có thể có các dự án đề cập đến dự án lớn này mà sau đó có thể phải chia nhỏ. Điều này tất cả các công trình nhưng nó sẽ gây ra quá tải dự án sẽ không?

Tôi không thể tìm thấy giải pháp sạch tốt. Có lời khuyên nào không? Có một tiêu chuẩn cho điều này tôi có thể làm theo. Nếu VS có khả năng hiển thị nhiều hơn trong các chỉnh sửa của tệp csproj, điều này có thể hoạt động.

+0

FWIW: Tôi đã gặp vấn đề tương tự để triển khai thư viện cho cả WPF và Silverlight: trong mã tôi chỉ sử dụng một số #if để chọn chi nhánh tùy thuộc vào nền tảng); đối với các tài liệu tham khảo, tôi đã tạo một số dự án "proxy", một cho mỗi lần triển khai thực sự hữu ích để tham khảo phiên bản đúng của thư viện (điều này dựa trên cấu hình xây dựng hiện tại WPF/SILVERLIGHT); Tôi thừa nhận mã phổ biến trong các dự án chuyên dụng được gắn liền với ".Common". Cuối cùng, điều này khá sạch sẽ và có thể sử dụng được, bạn chỉ cần nhớ thêm mã mới vào các dự án ".ommon". – Pragmateek

+0

Bạn có thể đưa ra một số ví dụ cụ thể về những thứ hoạt động trên nền tảng chứ không phải trên nền tảng khác không? – Pragmateek

+0

Có nhiều loại ví dụ khác nhau.Điều khó chịu nhất là khi bạn có một dự án lớn và bạn chỉ muốn biên dịch một nửa trong MONO cho MAC OSX chứ không phải phần còn lại (vì bạn không cần phần còn lại và vì nó sẽ không biên dịch ngay cả khi bạn cần nó). Tôi có thể chia nó thành hai dự án nhưng nếu tôi có một nền tảng khác (nói MAC Linux), điều này sẽ xảy ra với một số điểm chung với các cửa sổ và những thứ khác chung với MAC. Giờ thì sao? – Mark

Trả lời

2

Đây là một vấn đề lập trình nổi tiếng, nếu giải pháp tồn tại, chúng thường yêu cầu một số công việc và thậm chí nhiều hơn khi dự án không được thiết kế từ đầu để di động. Như bạn đã chỉ ra một cách chính xác, câu lệnh được xử lý trước sẽ nhanh chóng trở thành một chi phí và một nỗi đau thực sự để duy trì và mở rộng theo thời gian.

Tuy nhiên, không dễ trả lời câu hỏi này trực tiếp vì giải pháp bạn đang tìm kiếm có thể phụ thuộc nhiều vào việc triển khai của bạn. Nói chung tôi sẽ tư vấn cho bạn để làm cho sử dụng rộng rãi nổi tiếng mẫu thiết kế như Abstract Factory, Bridge, Facade vv

Là một exmaple, hãy bắt đầu bằng cách xác định mỗi mảnh duy nhất của mã mà phụ thuộc nền tảng, xác định các giao diện API chịu trách nhiệm để xử lý các đặc trưng này trong dự án cốt lõi của bạn và triển khai chúng thành các dự án chuyên dụng - thường là một dự án trên mỗi nền tảng. Khi đã xong, hãy quay lại dự án cốt lõi của bạn và xác định một giao diện sẽ chứa các phương thức nhà máy để khởi tạo các lớp cụ thể này. Một lần nữa thực hiện các nhà máy cụ thể trong các dự án tương ứng của họ.

Tại thời điểm này, bạn có thể quyết định thời gian chạy mà chương trình phụ trợ bạn muốn sử dụng bằng cách chọn nhà máy sẽ khởi tạo lớp học của bạn. Bước tiếp theo sẽ là cung cấp một số hệ thống có thể cắm để tải nhà máy mong muốn trong thời gian chạy, nhờ vào sự phản ánh phần này có lẽ là phần dễ nhất. Bạn đi mặc dù tất cả các hội đồng chứa trong một thư mục đặc biệt, phân tích các loại của họ để phát hiện nếu họ thực hiện các giao diện nhà máy của bạn và nếu họ làm: tải chúng.

+0

Trong khi câu trả lời của bạn thú vị khi vấn đề ở cấp độ lập trình IMHO, những gì OP cần là cách quản lý các mục dự án (sln, csproj, references ...) nhiều hơn chính mã đó vì thực thi Mono và Microsoft thực sự đóng ... nhưng tôi có thể sai. – Pragmateek

+0

Dù sao +1 tất nhiên :) – Pragmateek

+0

@Pragmateek Xin vui lòng chấp nhận lời xin lỗi của tôi nếu tôi tắt chủ đề. Tôi có thể đã hiểu lầm câu hỏi. :( – dna

0

Theo nguyên tắc chung, hãy giữ các dự án trong một giải pháp nhỏ và súc tích; các bit phụ thuộc vào nền tảng lý tưởng nên được thực hiện trong các dự án riêng biệt hoàn toàn.Bạn có thể muốn xem xét các phương pháp thiết kế phần mềm sáng tạo như mẫu nhà máy Tóm tắt để giữ cho các phụ thuộc nền tảng cụ thể thấp, được nhóm và trong kiểm tra.

Trên mức trừu tượng, một cách tiếp cận để theo dõi sự phát triển là sử dụng Team Foundation Server (TFS). Về cơ bản nó cung cấp chức năng git cho việc phát triển Visual Studio, vì vậy bạn có thể dễ dàng theo dõi csproj. Nếu bạn có một nhóm làm việc trên Java hoặc Android, thông qua Eclipse, bạn có thể sử dụng TFS thông qua plugin TFS để giữ cho mọi người trên cùng một trang và theo dõi các thay đổi và sửa đổi trong các dự án và trong giải pháp tổng thể của bạn.

Các dự án thông thường có triển khai nhiều nền tảng tiềm năng được cấu trúc theo cách này theo cách này, ngay từ giai đoạn hình dung và lập kế hoạch. Nếu bạn đang mắc kẹt với một dự án mà bây giờ bạn muốn port, bạn có thể sử dụng hai tùy chọn đầu tiên mà bạn đề xuất, và nếu phân biệt các assembly là một vấn đề, có nhiều phần mềm giải mã bên thứ ba có thể thực hiện công việc cho bạn.

Hy vọng điều đó sẽ hữu ích.

+0

Java phải làm gì với tệp .csproj? downvoting – knocte

+0

Xin lỗi. Tôi đã sửa câu trả lời, ý tôi là thay đổi dự án cho các nhóm phát triển Java cũng có thể được theo dõi qua TFS. Tôi phải bỏ qua ý nghĩa của câu trả lời khi tôi thêm vào đó chút ít. – Boss302

3

Bạn cũng có thể thiết lập cấu trúc thư mục và chia giải pháp thành giải pháp chung chứa các dự án độc lập nền tảng và giải pháp nền tảng cụ thể chứa các dự án cụ thể cho nền tảng.

Vì vậy, ví dụ: một ứng dụng.sln chứa tất cả các dự án phổ biến của bạn và vì lợi ích của đối số, chúng tôi cũng có giải pháp iOS và Android.

  • thư mục gốc
    • ứng dụng (thư mục)
    • application.Droid (thư mục)
    • application.Ios (thư mục)
    • application.sln
    • application.Droid.sln
    • application.Ios.sln

Trong các giải pháp nền tảng cụ thể mà bạn có thể tham chiếu đến các dự án phổ biến bằng cách thêm ví dụ một thư mục '[ứng dụng]' với các thư mục con dự án chung bổ sung vào các dự án nền tảng cụ thể của bạn. Thêm liên tục tất cả các tệp phổ biến được yêu cầu dưới dạng liên kết.

Câu trả lời ở trên là một trong những khả năng bạn cũng có thể:

  • Tạo một thư viện lớp cầm tay mà bạn chia sẻ giữa các dự án cụ thể nền tảng
  • Sử dụng MvvmCross (MvvmCross GitHub), do đó bạn có một dự án cốt lõi mà bạn có thể tham chiếu trong các dự án cụ thể của nền tảng của bạn