2012-03-07 37 views
7

Tôi muốn có một chức năng trên dịch vụ WCF với kiểu trả về như giao diện, nhưng khi tôi gọi nó từ máy khách, tôi nhận được System.Object, không phải lớp thực hiện giao diện dịch vụ được gửi.Cách hiển thị giao diện trong dịch vụ web

Dưới đây là một số mẫu mã:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

public interface IMyObject 
{ 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject : IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

Trong việc thực hiện dịch vụ này, tôi có:

public class LinqService : IService 
{ 
    public string SayHello() 
    { 
     return "Hello"; 
    } 

    public IMyObject GetMyObject() 
    { 
     return new MyObject(); 
    } 
} 

SayHello() hoạt động tốt, nhưng GetMyObject() trả về một System.Object. Làm cách nào để thay đổi mã này để GetMyObject() trả về một đối tượng triển khai IMyObject?

Sửa 1

Thay đổi mã như sau:

using System.Runtime.Serialization; 
using System.ServiceModel; 

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

[ServiceKnownType(typeof(MyObject))] 
public interface IMyObject 
{ 
    [OperationContract] 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject:IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

Nhưng không thành công!

+0

Tôi có thể hỏi mục đích trả lại giao diện từ phương pháp WCF của bạn không? – CSharpenter

+0

Cũng giống như vậy bạn có thể trả lại i nterface từ một phương thức: Ẩn thực hiện từ người dùng wcf. tại sao người dùng wcf của tôi nên biết về bất kỳ lớp nào mà tôi đã triển khai cho một giao diện? Người dùng chỉ cần biết những thuộc tính hoặc phương thức mà một đối tượng đang thực hiện. Trong ví dụ của tôi, tôi có thể trả về hàm IMyObject khác nhau dựa trên một số tham số. – mans

+0

Nói chung, đó là một ý định tốt, nhưng khá vô nghĩa. Người gọi sẽ không thấy bất kỳ "triển khai" nào.Cũng có 'OperationContract' bên trong' DataContract' không được hỗ trợ. Hai khái niệm thực sự là riêng biệt. Bạn nên xem lại [Hợp đồng dịch vụ thiết kế] (http://msdn.microsoft.com/en-us/library/ms733070.aspx) trên MSDN để biết thêm thông tin. –

Trả lời

9

Tất cả các đối số hợp đồng WCF và loại trả về phải được tuần tự hóa; giao diện không. This question khám phá cùng một vấn đề với câu trả lời xoay quanh thuộc tính KnownType; nếu bạn định chuyển các bản triển khai khác nhau của IMyObject Tôi muốn đề xuất điều này, nếu không bạn sẽ phải thay đổi kiểu trả về thành MyObject.

+0

Vui lòng xem chỉnh sửa của tôi trong câu hỏi gốc. – mans

+1

Từ quan điểm thiết kế thuần túy, câu hỏi của bạn "tại sao người dùng wcf của tôi nên biết về bất kỳ lớp nào mà tôi đã triển khai cho giao diện?" là hoàn toàn hợp lệ, nhưng tiếc là nó chỉ là một thực tế của cách WCF hoạt động. –

+0

Thử thêm thuộc tính 'KnownType' và' ServiceKnownType' và thêm chúng vào 'IService' thay vì' IMyObject'. –

1

Ghi chú thêm về serialization Các quy tắc sau cũng áp dụng cho các loại hỗ trợ bởi Hợp đồng Serializer dữ liệu:

loại Generic được hỗ trợ đầy đủ các serializer hợp đồng dữ liệu.

Loại dễ vỡ được hỗ trợ đầy đủ bởi bộ nối tiếp hợp đồng dữ liệu.

Loại giao diện được coi là Đối tượng hoặc, trong trường hợp giao diện thu thập, làm loại bộ sưu tập.

.....

thấy đầy đủ MSDN Additional Notes on Serialization


EDIT:

Tôi đoán bạn đang nói về khách hàng hoạt Object. Để tìm hiểu thêm về điều đó, hãy xem bài viết sau Returning an interface from a WCF service Bạn thấy bạn chỉ có thể gửi dữ liệu thông qua tuần tự hóa trong WCF nhưng không thực hiện. Một cách khác làm cho vấn đề của bạn là sử dụng instancing.

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