8

tôi phát triển (viết lại vào WCF) một tập tin phân tích cú pháp dịch vụ web chấp nhận string[] và trở ISection[] nhưng thực sự đây là một tập hợp các giao diện lồng nhau:Dữ liệu Hợp đồng Được biết đến các loại và một tập hợp các giao diện kế thừa nhau

namespace Project.Contracts // Project.Contracts.dll 
{ 
    public interface ISection { } 

    public interface ISummarySection : ISection { } 

    public interface IDataSection : ISection { } 
} 

và lớp:

namespace Project.Format.A // Project.Format.A.dll 
{ 
    [DataContract] 
    public class SummarySectionFormatA : ISummarySection { } 

    [DataContract] 
    public class DataSectionFormatA : IDataSection { } 
} 

giao diện dịch vụ và việc thực hiện:

[ServiceContract] 
public interface IService // Project.Contracts.dll 
{ 
    ISection[] Parse(string format, string[] data); 
} 

[ServiceKnownType(typeof(SummarySectionFormatA))] // tried this also 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public class Service : IService // Project.Service.dll 
{ 
    public ISection[] Parse(string format, string[] data) 
    { 
     return Factory.Create(format).Parse(data); 
    } 
} 

tôi đã cố gắng để cấu hình declaredTypes trên cả hai máy chủ và khách hàng:

<system.runtime.serialization> 
    <dataContractSerializer> 
    <declaredTypes> 
     <add type="Project.Contracts.ISumarySection, Project.Contracts"> 
     <knownType type="Project.Format.A.SummarySectionFormatA, Project.Format.A" /> 
     </add> 
     <add type="Project.Contracts.IDataSection, Project.Contracts"> 
     <knownType type="Project.Format.A.DataSectionFormatA, Project.Format.A" /> 
     </add> 
    </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

Nhưng vẫn nhận được lỗi tương tự:

"Type 'DataSectionFormatA' with data contract name 'DataSection:http://schemas.example.com/Parse' is not expected.

hoặc

The underlying connection was closed: The connection was closed unexpectedly.

tôi không thể trang trí giao diện với KnownTypeAttribute vì các dự án Hợp đồng không tham chiếu đến các dự án Định dạng và tham chiếu phá vỡ thiết kế. Đó là lý do tại sao tôi muốn sử dụng cấu hình.

+0

Bạn có thể đăng hợp đồng hoạt động dịch vụ của mình không, vui lòng –

+0

@hugh: Chắc chắn, đã cập nhật. – abatishchev

Trả lời

0

Cố gắng để làm việc này:

[KnownType("GetKnownType")] 
public class Section 
{ 
    static Type[] GetKnownType() 
    { 
     return new[] 
     { 
      Type.GetType("Project.Format.A.DataSectionFormatA, Project.Format.A") 
     }; 
    } 
} 

nhưng dường như cả máy chủ và máy khách phải tham khảo Project.Format.A.dll để làm cho nó hoạt động (phương thức không trả lại null)

2

Hãy nhìn vào mã bên dưới

[ServiceContract] 
[ServiceKnownType(typeof(SummarySectionFormatA))] 
[ServiceKnownType(typeof(DataSectionFormatA))] 
public interface IService {} 

public class Service : IService {} 
+0

Ok, tôi hiểu rồi. Vì vậy, bạn đề nghị trang trí giao diện (hợp đồng dịch vụ) nhưng không thực hiện. Nhưng như tôi đã đề cập ở dưới cùng của câu hỏi của tôi, tôi không muốn làm điều đó, bởi vì giao diện được đặt vào Contracts.dll mà không tham chiếu đến các dll khác trong dự án, và nó không thể ngăn ngừa tham chiếu vòng tròn. Tôi muốn sử dụng một cấu hình. – abatishchev

1

Tôi tin rằng bạn nên thay đổi việc triển khai của mình một chút ... xem cái này question và xem nếu nó giúp.

+0

Phải. Câu hỏi chính của tôi là tại sao không cấu hình. Có vẻ vì dự án không được tham chiếu (những gì tôi muốn tránh) và Type.GetType() trả về null. Cần phải thay đổi thực hiện thực sự. – abatishchev

+0

Chính xác! Vấn đề là dịch vụ phụ thuộc vào một cái gì đó không rõ ... Ngoài ra tôi muốn đặt câu hỏi về việc sử dụng Giao diện cho các hợp đồng dữ liệu, tại sao bạn có ý định trừu tượng điều đó. Bạn nên khuyên bạn nên làm nó một cách cụ thể hoặc nghĩ về góc đó. – Wali

+0

Đó là thiết kế ban đầu và nó hoạt động tốt như một phần của ứng dụng web. Bây giờ tôi đang tách logic phân tích cú pháp khỏi ứng dụng thành dịch vụ web chuyên dụng (WCF), do đó, cố gắng thực hiện điều đó mà không cần thay đổi thiết kế chính trước tiên. – abatishchev

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