2008-08-09 27 views
7

Tôi vẫn còn mới vào thế giới ASP.NET, vì vậy tôi có thể thoát khỏi cơ sở ở đây, nhưng cho đến nay đây là kiến ​​thức tốt nhất của tôi (có giới hạn) !Kết quả Dịch vụ Web ASP.NET, Lớp Proxy và Chuyển đổi Loại

Cho phép nói rằng tôi có đối tượng kinh doanh chuẩn "Liên hệ" trong không gian tên Business. Tôi viết một Web Service để lấy thông tin của Contact từ một cơ sở dữ liệu và trả lại nó. Sau đó tôi viết một ứng dụng khách để yêu cầu các chi tiết đã nói.

Bây giờ, tôi cũng tạo một phương thức tiện ích có "Liên hệ" và thực hiện một số phép thuật với nó, như Utils.BuyContactNewHat() nói. Tất nhiên, người liên hệ có loại Business.Contact.

Tôi sau đó quay trở lại ứng dụng khách của tôi và muốn sử dụng phương pháp BuyContactNewHat, vì vậy tôi thêm một tham chiếu đến không gian tên Utils của mình và ở đó. Tuy nhiên, một vấn đề nảy sinh với:

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

Kể từ khi kiểu trả về của GetContactMyWebService.Contact và không Business.Contact như mong đợi. Tôi hiểu tại sao điều này là, bởi vì khi truy cập một dịch vụ web, bạn thực sự đang lập trình chống lại lớp proxy được tạo bởi WSDL.

Vì vậy, có cách nào "dễ dàng hơn" để đối phó với loại không phù hợp này không? Tôi đã xem xét có lẽ cố gắng để tạo ra một lớp chuyển đổi chung sử dụng sự phản chiếu để đảm bảo hai đối tượng có cùng một cấu trúc, hơn là chỉ đơn giản là chuyển các giá trị từ một đến cái kia.

Trả lời

4

Bạn đang đi đúng hướng. Để lấy dữ liệu từ đối tượng proxy trở lại vào một trong các đối tượng của riêng bạn, bạn phải làm mã bên tay trái. tức là sao chép giá trị thuộc tính. Tôi sẽ đặt cược bạn rằng đã có một phương pháp chung ở đó sử dụng sự phản chiếu.

Một số người sẽ sử dụng một thứ khác ngoài dịch vụ web (.net remoting) nếu họ chỉ muốn có đối tượng kinh doanh trên dây. Hoặc họ sẽ sử dụng serialization nhị phân. Tôi đoán bạn đang sử dụng dịch vụ web vì một lý do, vì vậy bạn sẽ phải sao chép thuộc tính.

4

Bạn không thực sự phải sử dụng lớp được tạo mà WSDL cung cấp cho bạn. Nếu bạn nhìn vào mã mà nó tạo ra, nó chỉ thực hiện các cuộc gọi vào một số lớp .NET framework để gửi các yêu cầu SOAP. Trong quá khứ tôi đã sao chép mã đó vào một tệp .cs bình thường và chỉnh sửa nó. Mặc dù tôi đã không cố gắng cụ thể này, tôi không thấy lý do tại sao bạn không thể bỏ định nghĩa lớp proxy và sử dụng lớp gốc để nhận được kết quả của cuộc gọi SOAP. Nó phải đã được thực hiện phản ánh dưới mui xe, có vẻ như một sự xấu hổ để làm điều đó hai lần.

1

Tôi khuyên bạn nên xem xét việc viết phần mở rộng Trình nhập giản đồ, mà bạn có thể sử dụng để kiểm soát việc tạo mã proxy. Cách tiếp cận này có thể được sử dụng để giải quyết vấn đề của bạn mà không cần kludges (chẳng hạn như sao chép các đối tượng từ một namespace này sang namespace khác, hoặc sửa đổi lớp reference.cs được tạo ra chỉ để thay thế lần sau khi bạn cập nhật tham chiếu web).

Dưới đây là một (rất) tốt hướng dẫn về đề tài này:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

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