2013-03-07 35 views
10

tôi đã hai phương pháp đặt tên nhưPhương pháp quá tải không được dịch vụ WCF hỗ trợ?

[OperationContract] 
UserAccount GetUser(Int32 id); 

[OperationContract] 
UserAccount GetUser(string username, string password); 

khi tôi cố gắng để xây dựng chúng, họ nói rằng bạn không thể có phương pháp cùng tên trong dịch vụ? Là nó.

+1

Lưu ý: [Đa hình] (http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming) khác với quá tải. Ngoài ra, vui lòng bao gồm thông báo lỗi * chính xác * trong các câu hỏi vì nó làm cho chúng dễ tìm kiếm hơn một chút (nếu ai đó tìm kiếm thông báo lỗi đã nói). –

+0

Quá tải là việc thực hiện đa hình. Đa hình là một khái niệm trừu tượng. –

+0

Quá tải là trực giao đối với đa hình và tồn tại ở một số ngôn ngữ không hỗ trợ đa hình [subtype]. Quá tải cũng không có trong một số ngôn ngữ hỗ trợ đa hình [subtype]. Ghi đè thường được liên kết với đa hình [subtype], nhưng tôi digress .. –

Trả lời

14

Đây là giới hạn của WSDL. Nó không hỗ trợ các khái niệm quá tải giống như C# /. NET, sao cho các tên phương thức trên các dịch vụ phải là duy nhất. Bạn có hai tùy chọn để giải quyết vấn đề của mình.

Đầu tiên là sử dụng các tên khác nhau cho các phương pháp của bạn. Một trong những khác là để thiết lập Name tài sản trên một trong OperationContracts của bạn như vậy

[OperationContract(Name="GetUserById")] 
UserAccount GetUser(Int32 id); 

[OperationContract] 
UserAccount GetUser(string username, string password); 
+0

gr8 cảm ơn ... vì vậy bây giờ tôi sẽ nhận ra nó là GetUserById hoặc GetUser, am i ryt –

+3

@Arun Tên được sử dụng cho Mô tả WSDL về Dịch vụ WCF của bạn. Nếu bạn sử dụng WCF-Client bình thường, nó sẽ cung cấp các phương thức quá tải khi bạn định nghĩa chúng trên giao diện của bạn – Jehof

2

Hãy thử điều này:

- [OperationContract(Name= "GetUserWithID")] 
    UserAccount GetUser(Int32 id); 

- [OperationContract(Name= "GetUserWithUserName")] 
    UserAccount GetUser(string username, string password); 

More Info

4

WSDL không hỗ trợ các khái niệm quá tải cùng của C#. Bạn có thể sử dụng Tên trong OperationContract để chỉ định phương thức của mình

[OperationContract(Name="GetUserInt")] 
UserAccount GetUser(Int32 id); 

[OperationContract(Name="GetUserString")] 
UserAccount GetUser(string username, string password); 
0

Đây là nhược điểm của WCF. Lý do đằng sau điều này là khi chúng ta dựa vào dịch vụ cho khách hàng thì không nên sao chép, nếu không khách hàng sẽ nhầm lẫn phương pháp nào đang làm gì? Vì vậy, đây là các tùy chọn để giải quyết vấn đề. Bằng cách sử dụng thuộc tính tên khác nhau của Hợp đồng hoạt động.

[OperationContract (Tên = "GetUserByID")]

UserAccount GetUser (Int32 id);

[OperationContract (Tên = "GetUserByUName_Password")]

UserAccount GetUser (string username, string password);

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