2012-04-02 40 views
11


tôi có hai lớp dữ liệu chỉ chứa các thành viên dữ liệu (không có chức năng). Một là CallTask ​​ khác là SmsTask. Hai lớp này có một số thuộc tính phổ biến như ID, ĐT. Tôi đặt các thuộc tính phổ biến trong một lớp giao diện riêng biệt và tôi sử dụng lớp giao diện này trong dự án của tôi bất cứ khi nào thích hợp.
Bây giờ tôi đã thêm một WCFService vào dự án của tôi để chia sẻ dữ liệu giữa máy khách và máy chủ. Hãy xem xét việc thiết kế lớp sau đây:
cách đánh dấu giao diện là DataContract trong WCF

public interface IGsmTask : IComparable 
{ 
    string TaskID { get; set; } 
    string SessionID { get; set; } 
    string Tel { get; set; } 
} 

class CallTask : IGsmTask 
{ 
    #region IGsmTask Members 

    public string TaskID { get; set; } 

    public string SessionID { get; set; } 

    public string Tel { get; set; } 

    #endregion   
} 

class SmsTask : IGsmTask 
{ 
    #region IGsmTask Members 

    public string TaskID { get; set; } 

    public string SessionID { get; set; } 

    public string Tel { get; set; } 

    #endregion 

    public string SmsText { get; set; } 
} 

trong thiết kế này, tôi muốn lưu trữ CallTask, SmsTask, và IGsmTask cho khách hàng sử dụng các dịch vụ trong methots như sau;

[OperationContract] 
    public void AddTask(IGsmTask task) 
    { 

    } 

tôi đã cố gắng để đánh dấu [DataContract] trên IGsmTask nhưng nó mang lại cho tôi lỗi complition. Không có bất kỳ methot mà tôi có thể sử dụng giao diện như DataContracts? Hoặc làm thế nào tôi nên sử dụng KnownAttributes loại trong synerio này?
Cảm ơn.

+1

thay đổi giao diện thành lớp – Reniuz

+0

Cảm ơn Reniuz có vẻ như tôi không thể sử dụng giao diện cho mục đích này. – Fer

+1

WCF là một hệ thống ** dựa trên tin nhắn ** - máy khách gửi một thông báo XML-serialized đến máy chủ. Như vậy, các thông điệp đó phải là ** các loại cụ thể ** có thể được tuần tự hóa thành XML và được biểu diễn bằng một lược đồ XML. Giao diện không thể được tuần tự hóa thành XML .... –

Trả lời

11

Theo như tôi biết bằng cách sử dụng giao diện vì không thể thực hiện các giao dịch dữ liệu. Bạn có thể sử dụng một lớp cơ sở và thêm các thuộc tính knowntype trên mặt khác.

+0

tôi nghĩ rằng sẽ có một methot sử dụng giao diện như datacontracts. nếu không thể, tôi sẽ phải thay đổi giao diện của tôi thành một lớp cơ sở. Cảm ơn. – Fer

+1

Vì việc tuần tự hóa dựa trên các cá thể đối tượng, tôi nghĩ không có cách nào trực tiếp để thực hiện nó. – daryal

8

Fer: Mọi thứ đều có thể với thiết kế phù hợp.

Nếu vấn đề là:

một lớp là một hợp đồng dữ liệu

& &

1 hoặc nhiều thuộc tính của nó phải là một giao diện ...

public interface ICustomInterface 
{ 
    int Property1 {get;set} 
} 

[DataContract] 
public class MyClass 
{ 
    [DataMember(Name="_myInterface")] 
    public ICustomInterface MyInterface {get;set;} 
} 

Các vấn đề là khi de-serialization xảy ra - Không có cách nào để biến dữ liệu thành một lớp triển khai ICustomInterface.

Giải pháp là tạo một lớp cụ thể thực hiện giao diện và đưa trình thu thập/setter của thuộc tính công cộng (có giao diện kiểu) vào thuộc tính riêng của lớp bê tông.

public class CustomInterfaceImplementor: ICustomInterface 
{ 
    public int Property1 {get;set;} 
} 

[DataContract] 
public class MyClass 
{ 
    [DataMember(Name="_myInterface")] 
    private CustomInterfaceImplementor _MyInterface; 
    public ICustomInterface MyInterface 
    { 
      get {return (_MyInterface as ICustomInterface);} 
      set {_MyInterface = (value as CustomInterfaceImplementor);} 
    } 
} 
Các vấn đề liên quan