2010-09-28 29 views
7

Tôi đang tìm cách tạo lớp proxy được tạo cho Tham chiếu Web (không phải WCF) thực hiện giao diện chung để dễ dàng chuyển đổi giữa quyền truy cập dịch vụ web và quyền truy cập "trực tiếp" lớp kinh doanh trong các ứng dụng của khách hàng, một cái gì đó như:Lớp proxy của Dịch vụ Web để thực hiện giao diện

public IBusiness GetBusinessObject() 
{ 
    if (_mode = "remote") 
    return new BusinessWebService.Business(); // access through web service proxy class 
    else 
    return new Business(); // direct access 
} 

Tuy nhiên, các loại tùy chỉnh (ví dụ như CustomSerializableType trong các ví dụ dưới đây) không được tham chiếu trong lớp proxy tạo ra. Thay vào đó, các kiểu giống hệt nhau mới được tạo ra, khiến cho lớp proxy không thể thực hiện giao diện.

Có cách nào để làm cho lớp proxy được tạo tham chiếu các loại này hay không, tôi có bị sai về điều này không? Tôi có nên cân nhắc chuyển đổi dịch vụ web sang dịch vụ WCF thay thế không?


Chi tiết

giải pháp của chúng tôi bao gồm bốn dự án:

  • Một thư viện kinh doanh (chứa logic kinh doanh, các truy cập lưu trữ dữ liệu)
  • Một thư viện chung (chứa chung chức năng, bao gồm CustomSerializableType)
  • Dịch vụ web phó chủ (hoạt động như một proxy giữa khách hàng từ xa và lớp kinh doanh)
  • Một cửa sổ ứng dụng

khách hàng của chúng tôi muốn các cửa sổ ứng dụng để có thể chạy trong hai chế độ khác nhau:

  • chế độ địa phương , nơi ứng dụng chỉ sử dụng trực tiếp thư viện doanh nghiệp để truy cập dữ liệu
  • Chế độ từ xa, nơi ứng dụng liên lạc với dịch vụ web để truy cập dữ liệu

Để thực hiện điều này, chúng tôi đã tạo ra một giao diện, IBusiness, nằm trong thư viện chung và chứa tất cả các phương thức kinh doanh.

Interface

public interface IBusiness 
{ 
    CustomSerializableType DoSomeWork(); 
} 

lớp Business

public class Business : IBusiness 
{ 
    public CustomSerializableType DoSomeWork() 
    { 
    // access data store 
    } 
} 

dịch vụ Web

public class WebServiceBusiness : IBusiness 
{ 
    private Business _business = new Business(); 

    [WebMethod] 
    public CustomSerializableType DoSomeWork() 
    { 
    return _business.DoSomeWork(); 
    } 
} 

tạo lớp proxy (một tấn mã trái ra cho dễ đọc)

public partial class Business 
    : System.Web.Services.Protocols.SoapHttpClientProtocol 
{ 

    public CustomSerializableType DoSomeWork() 
    { 
    // ... 
    } 

    public partial class CustomSerializableType { 
    // PROBLEM: this new type is referenced, instead of the 
    // type in the common library 
    } 
} 
+0

Bạn đang sử dụng svcutil.exe để tạo các lớp proxy? –

+0

Không, tại thời điểm này tôi chỉ sử dụng công cụ tích hợp sẵn trong Visual Studio 2010. Tôi đã cố gắng rối tung xung quanh một chút với wsdl.exe, nhưng nó đã không giải quyết vấn đề của tôi. Svcutil.exe có phải là lựa chọn thay thế tốt hơn không? Điều đó có đòi hỏi tôi phải nâng cấp lên các dịch vụ WCF, thay vì các dịch vụ Web 'cũ' không? – bernhof

Trả lời

6

Giả sử rằng không gian tên mặc định cho khách hàng của bạn là "Client", và rằng tài liệu tham khảo web của bạn được đặt tên là "Proxy", sau đó làm như sau ;

  1. Trong thư mục gốc của dự án khách hàng của bạn, hãy tạo thư mục có tên "Proxy".
  2. Trong thư mục đó, tạo một lớp có tên là "Doanh nghiệp".
  3. Hãy lớp công lập và một phần, và có nó thực hiện giao diện

IBusiness của bạn theo cách này, bạn không cần phải sửa đổi Reference.cs. Bạn nên không bao giờ sửa đổi Reference.cs hoặc bất kỳ tệp nào khác được tạo thông qua tạo mã.

Lưu ý rằng điều này vi phạm các nguyên tắc của SOA bằng cách ràng buộc chặt chẽ khách hàng của bạn với dịch vụ của bạn. Ít nhất, bạn nên định nghĩa các giao diện đó trong một dự án riêng biệt, để bạn chỉ chia sẻ dự án "giao diện" giữa máy khách và dịch vụ.

+0

Nhưng những gì về các loại 'nhân bản' được bao gồm trong Reference.cs (và trong một số trường hợp tồn tại dưới dạng tệp .datasource trong Reference.map)? Các lớp này thay đổi hiệu quả các chữ ký của phương thức sao cho chúng không khớp với các ký hiệu trong giao diện, do đó ngăn cản tôi triển khai nó ngay từ đầu. Hay tôi đang thiếu thứ gì đó ở đây? – bernhof

+0

Có, bạn đã bỏ lỡ điều gì đó! Nếu các loại proxy không khớp với giao diện thì chúng không thể thực hiện giao diện. Bạn sẽ phải tạo tập các kiểu riêng của riêng mình mà _do_ thực hiện giao diện, nhưng sau đó gọi dịch vụ web để thực hiện công việc của họ. Đây chính xác là những gì bạn sẽ làm nếu bạn muốn chuyển đổi giữa một triển khai đã sử dụng một cơ sở dữ liệu và một cơ sở dữ liệu đã sử dụng một tệp XML. –

+0

Vì vậy, để gọi dịch vụ web, tôi cần phải chuyển đổi thủ công các loại được tham chiếu bởi giao diện (ví dụ: 'Common.CustomSerializableType') thành các loại (nhân bản) được lớp proxy sử dụng (ví dụ:' Proxy.CustomSerializableType')? – bernhof

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