2012-04-30 40 views
6

Tôi đang viết một dll đề cập đến một số dịch vụ WCF. Các dll hoạt động như một Gateway của dịch vụ và tất cả các cuộc gọi đang đi qua nó. Có thể có các cuộc gọi đồng thời.Trình bao bọc dịch vụ web

Tôi đã tham chiếu dịch vụ nhưng bây giờ tôi không thể quyết định cách viết các hàm bao bọc chính xác.

Có một số ví dụ hoặc thực tiễn tốt nhất cho chức năng này.

+0

thêm vào các cuộc thảo luận dưới đây (thực hành tốt nhất) tôi tìm thấy những điều sau đây (bằng cách Asker giống nhau) khá hữu ích: http://stackoverflow.com/questions/10575724/moving-wcf-contracts-to-a-separate-dll –

Trả lời

4

Tôi sẽ làm cho trình bao bọc khớp với giao diện dịch vụ web. Nó cũng sẽ là một ý tưởng tốt để bọc tất cả các vật thể tiếp xúc. Về cơ bản tạo proxy. Những gì tôi thấy thực sự hữu ích cho loại điều này là tạo ra một giao diện phù hợp với API và thực hiện điều đó. Bằng cách đó, bạn có thể tạo một phiên bản giả của DLL để kiểm tra mà không cần chi phí (hoặc chi phí tiềm năng) liên quan đến cuộc gọi WCF. Nó cũng sẽ làm cho nó đơn giản hơn nhiều nếu bạn cần phải thay thế các cuộc gọi WCF với một nhà cung cấp thay thế trong tương lai.

Ví dụ: giả sử rằng chúng tôi có dịch vụ WCF cho nhà cung cấp bên ngoài để xử lý thanh toán. Một cái gì đó như thế này:

void ProcessPayment(float amount); 

Chúng ta có thể dễ dàng móc mã này vào mã của chúng tôi. Vấn đề là một thay đổi đơn giản đối với giao diện sẽ dẫn đến việc chúng ta phải thực hiện thay đổi ở mọi nơi mã được tham chiếu. Điều tương tự cũng cần thiết nếu chúng tôi thay đổi nhà cung cấp cho người khác, ngay cả khi giao diện gần như giống hệt nhau. Thêm một cái gì đó giống như một giao diện đơn giản:

interface IPaymentProvider 
{ 
    void ProcessPayment(float amount); 
} 

Sẽ hoàn toàn tách mã của chúng tôi khỏi dịch vụ WCF. Chúng tôi có thể dễ dàng xây dựng một lớp học như sau:

class PaymentProviderAWrapper : IPaymentProvider 
{ 
    void ProcessPayment() 
    { 
     // Call the WCF service 
    } 
} 

Chúng tôi có thể tải động với khung nhà máy hoặc khuôn khổ phụ thuộc như Spring.NET. Thay đổi thành nhà cung cấp B sẽ đơn giản như tạo trình bao bọc mới:

class PaymentProviderBWrapper : IPaymentProvider 
{ 
    void ProcessPayment() 
    { 
     // Call provider B's Native DLL 
    } 
} 

Chuyển mã từ nhà cung cấp A sang B sẽ đơn giản như thay đổi cài đặt cấu hình.

Ngay cả khi chúng tôi biên soạn thư viện trực tiếp vào mã của chúng tôi, tất cả những gì chúng tôi cần làm là thay đổi logic xây dựng để sử dụng thư viện mới. Phần còn lại của ứng dụng của chúng tôi sẽ không thay đổi gì cả. Chỉ là một biên dịch lại đơn giản.

1

Để trả lời câu trả lời của Graymatter, tôi không thấy sự khác nhau giữa việc gọi gói dịch vụ cho phép thực hiện cuộc gọi đó và chuyển tiếp cuộc gọi đến dịch vụ thực, và chỉ gọi dịch vụ, giả sử một dịch vụ một bản đồ trên các cuộc gọi riêng lẻ và không có thay đổi về ràng buộc vận chuyển.

Lý do duy nhất bạn muốn tạo trình bao bọc ở địa điểm đầu tiên là giao diện được hiển thị theo cách nào đó không đáp ứng được yêu cầu của bạn trên chính nó. Có nhiều lý do bạn có thể muốn làm điều này nhưng một vài cái chung:

  1. dịch Protocol - dịch vụ không được tiếp xúc qua việc vận chuyển đúng ràng buộc đối với nhu cầu của bạn
  2. Dịch vụ Thành phần - các hoạt động giao diện quá hột và không đại diện cho các hoạt động cấp doanh nghiệp.
  3. Xác thực - có lẽ bạn yêu cầu lớp xác thực ở đầu điểm cuối mà bạn đang tiêu thụ.

Vậy làm thế nào để bọc các điểm cuối dịch vụ phụ thuộc vào lý do tại sao bạn muốn quấn dịch vụ ...

+1

Cách tôi đọc câu hỏi là nó là một dịch vụ WCF bên ngoài. Hooking như một dịch vụ trực tiếp vào mã của bạn là liều lĩnh và nguy hiểm. Điều gì sẽ xảy ra nếu nhà cung cấp bên ngoài thay đổi giao diện của họ một cách thường xuyên hoặc đóng cửa? Sau đó, bạn sẽ cần phải cập nhật tất cả các lĩnh vực mà sự tương tác với hệ thống bên ngoài xảy ra với giao diện được cập nhật hoặc nhà cung cấp mới. Bao gồm tất cả các gói logic ở một nơi có ý nghĩa trong vấn đề này. Tôi có thể đã hoàn toàn hiểu sai câu hỏi ban đầu. – Graymatter

+0

@Graymatter, bạn đã hiểu chính xác. và những lý do bạn đã đề cập là lý do tại sao tôi muốn có dll này –

+0

Cảm ơn bạn đã trả lời. Tôi thừa nhận rằng điều này có thể là một lý do để gói dịch vụ của bạn trong một proxy tương tự nhưng trong thực tế thường xuyên như thế nào là một điểm cuối công cộng sẽ thay đổi hợp đồng của nó? Và nếu có, bạn có muốn cập nhật tất cả người tiêu dùng của mình để sử dụng phiên bản mới nhất không? Tôi nghĩ rằng nó quá cần thiết để có thêm một phần chuyển động trong giải pháp của bạn chỉ cho một mục đích này. –

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