2009-03-27 39 views
9

Tôi có ba dự án ứng dụng web có chung thư viện các điều khiển máy chủ tùy chỉnh. Chia sẻ mã đằng sau các tệp dễ dàng - chúng được biên dịch thành một dll mà tôi tham chiếu trong các dự án khác bằng cách sử dụng tham chiếu dự án. Nhưng làm cách nào để xử lý các tệp như JavaScript, tờ mẫu và hình ảnh? Tôi đang cố gắng để làm điều này "cách Visual Studio" để nó là dễ dàng nhất có thể để hiểu và gỡ lỗi.Làm cách nào để chia sẻ tài nguyên web phổ biến giữa các ứng dụng web trong Visual Studio?

Các thiết lập hiện tại là hơi như thế này:

 
CommonControlsWebApp 
+- CustomControls 
+- resources 
    +- images 
    +- scripts 
    +- stylesheets 

WebApp1 
+- resources* 

WebApp2 
+- resources* 

WebApp3 
+- resources* 

*) ảo thư mục trong IIS.

Thư mục ảo trên mỗi ứng dụng web trỏ đến thư mục tài nguyên trong CommonControlsWebApp của tôi. Điều này được cấu hình trong IIS. Visual Studio không thể hiểu liên kết này, do đó, việc gỡ lỗi yêu cầu tôi đính kèm theo quy trình IIS theo cách thủ công.

Một giải pháp khác có thể bao gồm mọi tài nguyên trong dll chung sử dụng WebResourceAttribute. Nhưng điều đó sẽ biến các liên kết src thành một cái gì đó như WebResource.axd? D = GUID khi tôi xem nguồn của các trang web của tôi và tôi sợ rằng điều này sẽ làm cho nó khá khó hiểu để gỡ lỗi.

Giải pháp thứ ba là sử dụng Subversion để bao gồm cùng một tệp trong cả ba giải pháp. Không ai trong nhóm đã thử điều này trước đây, vì vậy chúng tôi không chắc chắn về cách thức hoạt động của nó.

Tôi cảm thấy rằng tôi đang thiếu một số giải pháp tuyệt vời, rõ ràng về cách thiết lập dự án. Bất kỳ đề xuất?

Trả lời

2

Nhiều nhà phát triển kiểm soát nhóm tài nguyên web của họ bằng phương pháp thứ hai mà bạn mô tả - thêm chúng dưới dạng tài nguyên được nhúng trong .dll. Bằng cách này, bạn có thể phân phối các điều khiển mà không phải sao chép một loạt các thư mục và tệp vào mọi trang web muốn sử dụng chúng và đảm bảo đường dẫn thư mục phù hợp, v.v. tài nguyên của bạn.

Tuy nhiên, điều WebResource.axd là một hạn chế. Bạn thường có thể "gỡ lỗi" URL với một cái gì đó như Firebug để xem những gì thực sự đã được trả lại từ yêu cầu, nhưng tôi đồng ý, nó có thể là một nỗi đau nếu một cái gì đó không hoạt động chính xác. Một hạn chế khác là nếu bạn có hàng tá tài nguyên cho một điều khiển máy chủ, đặc biệt nếu chúng được tham chiếu nhiều lần (nghĩ về một ảnh nhỏ với hàng trăm hình ảnh nhỏ trên các nút) - thì URL có thể thêm một tấn byte thực Đầu ra HTML.

Nếu phân phối/bản địa hóa của bạn cần lớn hơn nhu cầu tối ưu hóa/gỡ lỗi, tôi sẽ xem xét nhúng tài nguyên.

Nếu không, thì bạn chắc chắn có thể làm # 3 - sao chép mọi thứ vào trang web của bạn bằng Subversion. Hãy xem SVN Externals để biết cách thiết lập. Một ít thời gian đầu tư vào việc học nó bây giờ có thể giúp bạn tiết kiệm tấn xuống đường!

2

Tôi đã thực hiện một cách dễ dàng và đặt tất cả các dự án của mình vào một giải pháp duy nhất. Sau đó, tôi tạo ra một dự án WebUserControlLibrary trong đó tôi đặt tất cả các điều khiển được chia sẻ.

Để có được chúng trong các dự án khác, tôi sau đó cấu hình các sự kiện xây dựng cho từng dự án để sao chép các UCS vào một thư mục đặc biệt:

copy "$(SolutionDir)WebUserControlLibrary\UserControls\*.ascx" 
    "$(ProjectDir)ImportedUserControls\UserControls" 

Và dĩ nhiên tham khảo các WebUserControlLibrary từ các dự án mà cần nó.

Ưu điểm của phương pháp này:

  • Debugging trong công trình Visual studio,
  • Không lặp lại code

Nhược điểm:

  • giải pháp clunky :)
  • Sau khi thay đổi tệp .ascx, dự án có được xây dựng lại. Điều này có nghĩa là không thể thay đổi html và làm mới trang trong IE và xem kết quả trực tiếp.
+0

Cảm ơn rất nhiều vì đề xuất này. Tôi sợ tôi chỉ có thể đánh dấu một câu trả lời là câu trả lời. –

+0

Không có vấn đề, chẳng hạn như cuộc sống :) – Lennaert

+0

Cách tiếp cận này hoạt động như thế nào với gỡ lỗi? Có thể đặt điểm ngắt trong tệp JavaScript được ghi đè bởi bản dựng không? –

0

Tôi có một vài tùy chọn để ném vào xô:

Lựa chọn 1: Sử dụng một dự án chia sẻ tài nguyên của bạn: http://rion.io/2017/03/22/sharing-is-caring-using-shared-projects-in-asp-net/

Tùy chọn 2 Chuyển đổi Class Library của bạn vào gói NuGet. Tôi không tin rằng bạn phải làm nhiều khi đóng gói khác hơn sau để bao gồm tất cả các thư mục và các tập tin withing thư mục dự án NuGet:

c: \ nuget.exe gói YOURPROJ.csproj -IncludeReferencedProjects -Prop vBulletin = AnyCPU -Exclude ** .tt -Exclude **. Txt

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