2009-01-05 35 views
8

Tôi đã làm việc trên thư viện dịch vụ WCF, nơi hy vọng tất cả logic kinh doanh sẽ kết thúc. Vấn đề mà tôi đang gặp phải là đôi khi tôi phải sửa chữa nhanh chóng một dịch vụ và để áp dụng các bản sửa lỗi đó, tôi phải ngừng Dịch vụ Windows, thay thế dll dịch vụ và sau đó khởi động lại dịch vụ Windows. Điều này sẽ bắt đầu gây ra thêm đau đầu khi chúng ta bắt đầu di chuyển nhiều hơn và nhiều hơn nữa logic của chúng ta đến lớp này và phải tắt toàn bộ dịch vụ để thực hiện bất kỳ thay đổi nào.Cách tốt nhất để xây dựng thư viện dịch vụ WCF có thể cắm nóng

Điều tôi muốn làm là tạo một vỏ rỗng của dịch vụ Windows và tự động tải và dỡ dịch vụ. Cách tốt nhất để tải và dỡ bỏ .Net DLL theo yêu cầu là gì? Hoặc là tốt hơn để dựa vào IIS cho loại dịch vụ?

Trả lời

8

Nếu bạn đang sử dụng WCF, một tên bạn cần biết là Juval Lowy. Ông là người sáng lập IDesign và là một trong những chuyên gia được công nhận nhất về WCF. Cuốn sách Programming WCF Services của chúng tôi được đánh giá cao.

IDesign website cung cấp toàn bộ chuỗi lượt tải xuống miễn phí có liên quan đến WCF. Tất cả những gì bạn phải làm là cung cấp địa chỉ email của bạn và tuân theo thỏa thuận cấp phép chuẩn của IDesign.

Quan tâm đặc biệt đối với bạn có thể là Máy chủ lưu trữ tên miền ứng dụng, Nhà máy In-Proc và Tải xuống trong máy chủ được tìm thấy here.

2

Bạn có thể sử dụng phản chiếu để tự động tải logic cụ thể mà bạn cần, nhưng hiệu suất đạt được trên các dịch vụ của bạn sẽ rất lớn so với những gì bạn muốn bạn mô tả.

Nếu bạn chưa từng sử dụng sự phản chiếu trước đây, đây là mẫu tôi đã chụp từ dự án tôi có. Nó cho thấy làm thế nào để tải một hội đồng và gọi một phương pháp với một số thông số.

Assembly a = GetAssembly(); 
Type t = ExportModule.GetExportType(a); 
if (t == null) throw new Exception("No proper type found."); 

object iExportModule = Activator.CreateInstance(t); 
object[] arguments = new object[] { _export.ConnectionString, GetFileName() }; 

t.InvokeMember("ExecuteExport", BindingFlags.Default | BindingFlags.InvokeMethod, 
    null, iExportModule, arguments); 

Rõ ràng là tôi không biết môi trường của bạn, nhưng nói chung tôi sẽ nói rằng nó tốt hơn để đóng cửa dịch vụ cho một vài phút để cập nhật phần mềm hơn để thay đổi toàn bộ mô hình của bạn phải năng động.

Nếu bạn thực sự có bản sửa lỗi nóng liên tục yêu cầu dịch vụ bị hỏng, tôi không nghĩ bạn nên có một dịch vụ trung tâm. Bạn sẽ lấy nó xuống mọi lúc. Tốt hơn để có các dịch vụ riêng biệt đối phó với các hàm lôgic khác nhau để toàn bộ ứng dụng của bạn không bị hạ xuống (điểm duy nhất của sự thất bại).

1

Sau khi lắp ráp đã được tải vào một AppDomain, nó sẽ vẫn còn trong bộ nhớ cho đến khi AppDomain đó được tải và hủy. Vì vậy, để mô phỏng một môi trường "có thể cắm nóng", bạn phải thiết lập và xé bỏ AppDomains (từ quá trình chính 'AppDomain) sẽ lưu trữ các hội đồng kinh doanh thực tế và chạy logic ứng dụng.

Không cần phải nói, bạn nên mong đợi hiệu suất xuống cấp nếu bạn liên tục tạo/phá hủy AppDomains cho mỗi cuộc gọi dịch vụ WCF. Nó có nghĩa là để tạo ra một ranh giới hoạt động được phân lập từ AppDomain chính của bạn để thực hiện công việc có ý nghĩa kéo dài trong một thời gian tốt. Lợi thế với AppDomains là bạn có thể conserve memory usage nếu bạn có khá nhiều cụm logic kinh doanh mà bạn muốn bỏ qua thời gian.

Ví dụ chính về loại thiết lập động này và xé xuống là ASP.NET. Thời gian chạy ASP.NET tạo ra một AppDomain cho mỗi ứng dụng web. Nếu một cái gì đó thay đổi trong trang web, như web.config, AppDomain sẽ được tải xuống và thiết lập AppDomain mới cho phiên bản mới của ứng dụng web - ứng dụng tái chế.

0

Hãy thử sử dụng MEF để quản lý các phụ thuộc cùng với MAF (System.AddIn) để tải/dỡ các bổ trợ.

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