2011-01-19 32 views
5

Tôi viết một dịch vụ WCF cho hoạt động Chèn và xóa ở đây chúng tôi đã sử dụng phương pháp chung nhưng nó cung cấp lỗi sau "System.Runtime.Serialization.InvalidDataContractException: Loại 'T' không thể xuất dưới dạng lược đồ vì nó là một kiểu generic mở. Bạn chỉ có thể xuất một kiểu generic nếu tất cả các kiểu tham số chung của nó là các kiểu thực tế. "WCF phơi bày loại chung 'T'

here "EntityBase2" là lớp cơ sở cho tất cả các đơn vị

[ServiceContract] 
[ServiceKnownType(typeof(EntityBase2))] 
public interface IBackupUtility 
{ 
    [OperationContract] 
    void Delete<T>(T entity) where T : EntityBase2; 

    [OperationContract] 
    void InsertORUpdate<T>(T entity) where T : EntityBase2;   
} 

Câu hỏi là làm thế nào tôi có thể tiếp xúc với loại chung 'T'?

+0

bản sao có thể có của [WCF. Các phương pháp chung của dịch vụ] (http://stackoverflow.com/questions/2906694/wcf-service-generic-methods) – decyclone

Trả lời

7

Tôi nghĩ rằng nó là imposible, làm thế nào nó có thể tạo ra các wsdl theo cách đó?

Bạn có hai lựa chọn:

  • Bạn có thể gửi các loại như một tham số.

  • Nếu bạn muốn hiển thị các hoạt động crud cho các thực thể, tôi khuyên bạn nên sử dụng trình tạo mã, có thể là mẫu T4 cho EF.

+0

+1 @Pablo là đúng. Bạn không thể sử dụng loại chung. –

+0

Cảm ơn bạn Pablo Castilla – Vikram

6

bài này là cũ thực sự, nhưng có lẽ một ai đó tìm thấy giải pháp này hữu ích: WCF and Generics

+0

Hoàn hảo. Giúp đáng kể! – Dann

+0

Gợi ý hữu ích trong bài viết đó về cách loại bỏ Hash![DataContract (Tên = "MyGenericObjectUsing {0}"] lớp công khai MyGenericObject Daniel

1
  1. trả lời cho câu hỏi này là cả Có và Không Có cho máy chủ tương lai và Không cho khách hàng tiềm năng.
  2. Chúng ta có thể tạo một Hợp đồng dữ liệu chung trên máy chủ nhưng trong khi sử dụng nó trong bất kỳ hợp đồng hoạt động nào, chúng ta phải chỉ định một kiểu dữ liệu chung chung.
  3. Và ở cuối khách hàng, hợp đồng dữ liệu sẽ chỉ được hiển thị dưới dạng loại dữ liệu mạnh không phải là chung chung.

    [DataContract] 
    public class MyGenericObject<T> 
    { 
        private T _id; 
    
        [DataMember] 
        public T ID 
        { 
         get { return _id; } 
         set { _id = value; } 
        } 
    } 
    
    [OperationContract] 
    MyGenericObject<int> GetGenericObject(); 
    

Đây là những gì chúng tôi có trong máy chủ chúng ta có thể thấy trong khi sử dụng hợp đồng dữ liệu chung, chúng ta phải xác định loại nếu không nó sẽ cung cấp cho biên dịch lỗi thời gian.

On khách hàng những gì chúng ta nhận được từ WSDL là một sau:

[DataContract] 
public class MyGenericObjectOfint 

Chúng ta có thể thấy ở đây những gì chúng ta nhận được từ WSDL không phải là một hợp đồng dữ liệu WSDL proxy chung tạo ra một lớp học với một cái tên mới sử dụng một số quy ước.

ước sử dụng là

Generic Class Name + "Trong" + Loại Parameter Tên + Hash

Hash không phải luôn luôn tạo ra, nó sẽ được tạo ra chỉ khi có một cơ hội va chạm tên .

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