2009-02-04 27 views
24

Trong dịch vụ WCF, tôi có hai lớp với thuộc tính [DataContract]. Một trong những lớp này có mối quan hệ "là-a" với lớp kia - vì vậy lớp B có thể kế thừa từ lớp A. Tuy nhiên, khi tôi định cấu hình kế thừa giữa hai lớp này, cả hai được biểu thị bằng thuộc tính [DataContract], siêu dữ liệu không tải được khi thử nghiệm dịch vụ.Trong WCF, các lớp hợp đồng dữ liệu có thể kế thừa từ một lớp khác không?

Điều này có thể thực hiện được trong WCF không? Tôi có thiếu thuộc tính khác không?

[DataContract] 
public class A 
{   
    [DataMember] 
    public MyCustomType AValue1{ get; set; } 

    [DataMember] 
    public MyCustomType AValue2 { get; set; } 
} 

[DataContract] 
public class B: A 
{  
    [DataMember] 
    public double BValue1{ get; set; } 

    [DataMember] 
    public double BValue2 { get; set; } 
} 

LƯU Ý: Các loại tùy chỉnh cũng được xác định bằng hợp đồng dữ liệu.

CẬP NHẬT: Dưới đây là các lỗi:

Error: Cannot obtain Metadata from http://localhost:8002/GISDataServices/mex If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8002/GISDataServices/mex Metadata contains a reference that cannot be resolved: ' http://localhost:8002/GISDataServices/mex '. Receivera:InternalServiceFault The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.HTTP GET Error URI: http://localhost:8002/GISDataServices/mex There was an error downloading ' http://localhost:8002/GISDataServices/mex '. The request failed with HTTP status 400: Bad Request.

UPDATE 2: Xem câu trả lời của tôi dưới đây.

Trả lời

38

Có, nhưng bạn cần phải trang trí lớp cơ sở với [KnownTypeAttribute] xây dựng nó với loại của lớp dẫn xuất. Ví dụ:

[DataContract] 
[KnownType(typeof(B))] 
public class A 
{ 
    [DataMember] 
    public string Value { get; set; } 
} 

[DataContract] 
public class B : A 
{ 
    [DataMember] 
    public string OtherValue { get; set; } 
} 
+0

Điều này dường như không hoạt động. Tôi vẫn gặp lỗi khi tải siêu dữ liệu. –

+0

Lỗi bạn đang thấy là gì? –

+0

Câu hỏi hay. Bạn có thể đăng lỗi chính xác của mình không? –

1

Dựa trên thử nghiệm này, nó sẽ hoạt động tốt. Cả hai lớp đều có Trình xây dựng mặc định không? Bạn đang sử dụng tính năng Tự động. Lưu ý, Trong mẫu cơ bản này các thuộc tính không bắt buộc. Ngoài ra, như David Morton đã đề cập đến bạn tùy thuộc vào yếu tố bạn đang quay trở lại, bạn có thể cần thuộc tính KnownType, tôi không phải là 100% nhưng loại đã biết có thể phải đi vào hợp đồng hoạt động.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serializer = new DataContractSerializer(typeof(Employee)); 

     var employee = new Employee() { Name="Joe", Salary=100000 }; 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, employee); 

      ms.Position = 0; 

      var newEmployee = serializer.ReadObject(ms) as Employee; 
     } 

     Console.ReadKey(); 

    } 
} 

[DataContract] 
public class Employee : Person 
{ 
    [DataMember] 
    public decimal Salary { get; set; } 
} 

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

[ServiceContract] 
interface IEmployeeService 
{ 
    [OperationContract] 
    Person GetPerson(); 

    [OperationContract] 
    Employee GetEmployee(); 

    [OperationContract] 
    [KnownType(typeof(Employee))] 
    Person GetEmployeeAsPerson(); 
} 
+0

Tôi đang sử dụng thuộc tính tự động nhưng những công việc đó tốt khi tôi loại bỏ cấu trúc thừa kế. –

+0

Cả hai lớp đều không sử dụng hàm tạo rõ ràng. –

+0

Bạn có thể cập nhật bài đăng của mình với cấu trúc kế thừa sự cố không? – bendewey

7

OK, tôi đã tìm ra câu hỏi. Câu trả lời là ... Tôi là một thằng ngốc. Nó chẳng liên quan gì đến thừa kế. Trong lớp cơ sở, tôi đã có một thành viên hợp đồng dữ liệu mà không có mệnh đề thuộc tính 'set' - chỉ là 'get'. Doh !!! Đưa vào một mệnh đề 'set' làm cho nó hoạt động như một sự quyến rũ.

Xin lỗi vì sự nhầm lẫn.

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