2010-02-22 34 views
9

Như tiêu đề ngụ ý tôi đang cố gắng để có được một sự hiểu biết về lý do tại sao trong WCF đôi khi mọi người chọn để "tạo proxy" vs sử dụng một ChannelFactory để tự tạo ra các trường hợp kênh mới. Tôi đã nhìn thấy các ví dụ của mỗi, nhưng chưa thực sự tìm thấy bất kỳ lời giải thích tại sao bạn sẽ đi cho một so với khác.Sử dụng kênh trực tiếp so với sử dụng Proxy?

Thành thật mà nói tôi đã chỉ từng làm việc với các kênh truyền hình và các ChannelFactory<T> từ mã tôi đã thừa hưởng, ví dụ:

IChannelFactory<IDuplexSessionChannel> channelFactory = 
    binding.BuildChannelFactory<IDuplexSessionChannel>(); 

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress); 

Vì vậy, tại sao tôi "tạo ra một proxy"? Những lợi ích và hạn chế là gì?

Trả lời

17

Sự khác biệt chính là thế này:

  • tạo một proxy chỉ đòi hỏi bạn phải biết địa chỉ URL nơi cư trú dịch vụ. Bằng cách tạo proxy, mọi thứ khác (hợp đồng dịch vụ và hợp đồng dữ liệu có liên quan) sẽ được xác định bằng cách kiểm tra siêu dữ liệu của dịch vụ

  • để trực tiếp tạo ChannelFactory<T>, bạn phải có quyền truy cập trực tiếp vào hội đồng có chứa hợp đồng dịch vụ đó T mà bạn đang tạo một nhà máy sản xuất kênh. Điều này chỉ bao giờ hoạt động nếu bạn về cơ bản kiểm soát cả hai đầu của kênh và bạn có thể chia sẻ hội đồng có chứa các hợp đồng dịch vụ đó. Thông thường, với dịch vụ của bên thứ ba, điều này sẽ không xảy ra - với dịch vụ của riêng bạn, vâng.

Điểm quan trọng thứ hai là thế này:

  • tạo một proxy tạo cơ bản nào hai bước mà bạn sẽ làm gì - tạo ra một ChannelFactory<T>, và từ đó, tạo ra các kênh thực tế - trong một một hàm tạo duy nhất. Bạn không kiểm soát được hai bước này.

  • tạo kênh của riêng bạn mang lại lợi ích, vì việc tạo ChannelFactory<T> là bước đắt tiền - vì vậy bạn có thể lưu vào bộ nhớ cache nhà máy kênh của bạn ở đâu đó. Tạo và tạo lại kênh thực tế từ nhà máy là bước ít tham gia hơn nhiều mà bạn có thể thực hiện thường xuyên hơn

Vì vậy, nếu bạn kiểm soát cả hai đầu của giao tiếp, dịch vụ và khách hàng, bạn có tùy chọn chia sẻ các hợp đồng dịch vụ trong một hội đồng riêng biệt, và do đó bạn có nhiều lựa chọn hơn.

Với hầu hết các dịch vụ của bên thứ ba, bạn chỉ cần không có tùy chọn đó.

3

Sử dụng proxy đơn giản và dễ hiểu hơn. Bạn nhận được để đối phó trong điều khoản của những điều đơn giản - các lớp học và phương pháp trên các lớp học - thay vì phức tạp, liên quan đến mạng những thứ như các kênh.

OTOH, điều này không được thực hiện dễ dàng hơn bằng các lỗ hổng thiết kế trong WCF có thể ngăn chặn việc sử dụng đơn giản cùng một proxy WCF mà chúng ta có thể làm với proxy ASMX:

using (var client = new MyServiceClient()) 
{ 
} 

Nếu bạn sử dụng mô hình này với WCF, bạn có thể mất ngoại lệ ban đầu khi khối bị thoát do một ngoại lệ. client.Dispose() có thể ném một ngoại lệ, sẽ ghi đè lên ngoại lệ ban đầu được ném. Một mô hình phức tạp hơn là bắt buộc.

+0

Bất kỳ lý do nào cho phiếu giảm giá? –

2

Điều này có thể giúp bạn:

Khi nào sử dụng proxy?

Nếu bạn có một dịch vụ mà bạn biết sẽ được nhiều ứng dụng sử dụng hoặc đủ chung để được sử dụng ở một vài nơi, bạn sẽ muốn sử dụng các lớp proxy.

Khi nào sử dụng ChannelFactory?

Kênh Lớp nhà máy được sử dụng để xây dựng kênh giữa khách hàng và dịch vụ mà không cần proxy. Trong một số trường hợp, bạn có thể có một dịch vụ được ràng buộc chặt chẽ với ứng dụng khách. Trong trường hợp này, bạn có thể tham khảo trực tiếp giao diện DLL và sử dụng ChannelFactory để gọi các phương thức của bạn bằng cách sử dụng nó.

Bạn cũng có thể tham khảo link sau đây để hiểu sự khác biệt giữa máy Channel và lớp Proxy http://ashishkhandelwal.arkutil.com/wcf/channelfactory-over-proxy-class-in-wcf/

1

Ưu điểm chính của ChannelFactory là bạn có thể tạo proxy khi chạy tự động khi đang bay. Với SvcUtil (Thêm tham chiếu web vào VS) bạn tạo proxy tại thời điểm thiết kế, do đó, việc triển khai thực hiện tĩnh hơn.

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