2010-05-13 54 views
6

Khi bạn tạo và sử dụng lớp proxy dịch vụ Web trong khung công tác ASP.Net, lớp cuối cùng kế thừa từ Thành phần, thực hiện IDisposable.Vứt bỏ một lớp Proxy Dịch vụ Web?

Tôi chưa bao giờ thấy một ví dụ trực tuyến nơi mọi người vứt bỏ một lớp proxy web, nhưng đã tự hỏi nếu nó thực sự cần phải được thực hiện. Khi tôi gọi chỉ một phương pháp, tôi thường bọc nó trong một câu lệnh, nhưng nếu tôi cần phải gọi nó nhiều lần trong toàn bộ trang, tôi có thể kết thúc bằng cách sử dụng cùng một ví dụ, và tự hỏi những nhánh nào không được xử lý nó.

Trả lời

8

Bạn cần phải hủy bỏ mọi thứ thực hiện IDisposable.

Việc thực hiện IDisposable nghĩa rằng đối tượng nắm giữ lên một cái gì đó rằng thu gom rác không theo dõi bản chất - có thể là một kết nối, có thể là một tập tin, có thể là một số xử lý khác - hoặc có thể là không có gì cả, nó không thực sự quan trọng. Bạn không nên quan tâm đến chính mình với các chi tiết triển khai vì chúng có thể thay đổi.

Lớp học có thể hoặc không thực sự sử dụng tài nguyên không được quản lý. Nó có thể hoặc có thể không có một finalizer. Nó tạo nên sự khác biệt nhỏ; nếu lớp thực hiện IDisposable, thì yêu cầu bạn Dispose khi bạn hoàn tất. Ngay cả khi phương thức Dispose không làm gì cả, bạn không bao giờ biết khi ai đó sẽ thay thế tham chiếu đến lớp đó bằng tham chiếu đến một lớp con thực sự là thì cần phải được xử lý.

3

Đôi khi Vứt bỏ() chỉ là giả (được thừa kế từ một lớp cơ sở), nhưng sau đó thực hành tốt để gọi nó là an toàn cho các thay đổi trong tương lai.

Proxy WebService/WCF giữ kết nối, vì vậy, bạn nên gọi Dispose() hoặc Close(). Làm như vậy bên trong một khối sử dụng là tất nhiên thích hợp hơn vì nó là ngoại lệ an toàn.

Nhưng trong trường hợp của bạn (sử dụng proxy trong nhiều phương pháp trên trang của bạn) việc sử dụng nhiều khối bằng cách sử dụng có thể sẽ có hiệu suất. Bạn có thể thay thế các khối bằng cách sử dụng lệnh Close() trong một sự kiện đến trễ trong chu kỳ trang. Tôi không chắc chắn về ASP.NET thực hành tốt nhất ở đây, nhưng tôi sẽ sử dụng OnPreRender hoặc OnPageUnload hoặc một cái gì đó.

Bạn sẽ mất an toàn ngoại lệ ở đây nhưng đó không phải là vấn đề cơ bản, GC sẽ giải quyết vấn đề đó.

1

IMHO, không có gì giống như xử lý lớp proxy dịch vụ web.

Hầu hết các proxy là:

  • không quốc tịch, như gọi điện thoại như sử dụng một trường hợp hoặc sử dụng nhiều trường hợp không thực hiện bất kỳ sự khác biệt
  • ý nghĩa không liên tục mà họ đóng kết nối càng sớm càng tất cả các câu trả lời được xử lý
6

Câu trả lời ngắn gọn là với Lớp proxy dịch vụ web, bạn nên đóng chúng và không loại bỏ chúng.

Trong hầu hết mọi trường hợp, bạn nên vứt bỏ những thứ triển khai IDisposable. Tuy nhiên, các lớp Proxy dịch vụ Web là một trường hợp đặc biệt.Với các lớp này và tất cả các lớp được kế thừa từ System.ServiceModel.ClientBase, cách tốt nhất là không phải là bỏ cuộc gọi mà gọi trực tiếp phương thức Đóng.

Sử dụng phản xạ, bạn có thể thấy phương thức Dispose của ClientBase chỉ cần gọi Close. Vì vậy, nếu không có ngoại lệ, DisposeClose cũng sẽ thực hiện tương tự. Tuy nhiên, nếu có một ngoại lệ, sẽ có những hành vi khác nhau.

Bởi vì phương pháp Close có thể ném ngoại lệ, bạn nên gọi trực tiếp và bắt ngoại lệ. Nếu bạn gọi phương thức Dispose, bạn cũng nên nắm bắt các ngoại lệ, nhưng mã của bạn sẽ khó hiểu hơn.

Điều này cũng có nghĩa là bạn nên tránh đặt tuyên bố của proxy trong tuyên bố using. Trong trường hợp này, nếu một ngoại lệ được ném vào khối using, nó sẽ bị che khuất. Cuộc gọi Dispose được tự động tạo bởi khối using sẽ được gọi vì nó nằm trong khối finally. Ngoại lệ được ném từ số Close trong số Dispose sẽ che khuất bất kỳ ngoại lệ nào đã bị ném trước đó.

Để xem các khám phá chi tiết hơn, hãy đọc các bài viết này trên MSDN, Coding Up Style, BlogginAbout.NetStackOverflow.

Đối với cốt truyện về lý do tại sao nó được triển khai theo cách này, hãy kiểm tra chủ đề này trên MSDN forums.

+1

Lưu ý rằng các liên kết đó cụ thể đối với Tài liệu tham khảo dịch vụ WCF, không phải tài liệu tham khảo Web .NET 2.0. Nó tạo sự khác biệt cách bạn tạo proxy của mình. – TrueWill

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