2013-01-06 23 views
5

Từ những gì tôi có thể nhìn thấy tôi phải tạo ra một kiểu dữ liệu "đặc biệt" cho từng loại dữ liệu tôi muốn chuyển qua WCF, vì vậy nếu tôi có một lớp học chia sẻ nhưSử dụng một kiểu dữ liệu được chia sẻ như DataContract trong WCF

public class District 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

và tôi muốn gửi một đối tượng huyện sử dụng WCF, tôi phải tạo ra một DataContract và do đó tôi phải tạo ra một lớp WCF mới

[DataContract] 
public class WCFDistrict 
{ 
    [DataMember] 
    public long Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

và sau đó khi tôi sử dụng nó trong một dịch vụ WCF trong việc thực hiện tôi của tôi phải phân tích cú pháp dữ liệu từ một đối tượng sang một đối tượng khác

public WCFDistrict GetDistrict(long id) 
{ 
    var district = _districtRepository.GetDistrict(id); 
    return new WCFDistrict {Id = district.Id, Name = district.Name}; 
} 

Có cách nào khác để chỉ sử dụng lại lớp được chia sẻ dưới dạng DataContract mà không có các thuộc tính đó trên đó không? Hoặc tôi có nên tạo một giao diện trên các lớp học mà họ có thể chia sẻ để tôi có thể truyền nó giữa chúng không? Hoặc thứ gì đó thứ ba?

Trả lời

9

Trước tiên, bạn không bắt buộc phải cung cấp DataContract; WCF sẽ tuần tự hóa các đối tượng Class Old Plain (POCO) một cách chính xác miễn là bạn đang sử dụng .Net 3.5 SP1 hoặc mới hơn.

Thứ hai, bạn có thể chia sẻ cùng một tệp lớp vật lý trong các dự án trên cả máy chủ và phía máy khách; chúng tôi có các dự án có hàng trăm lớp (và mã) được chia sẻ trực tiếp theo cách này và nó tiết kiệm một lượng lớn thời gian và công sức trong việc phát triển và thử nghiệm.

Có một vài bước cần thiết để có được điều này và chạy (làm điều này từ bộ nhớ vì vậy tôi có thể cần phải điều chỉnh các câu trả lời):

1) Trong các mặt hàng khác, nếu bạn đang sử dụng VB, tạo ra một dự án trong cùng một không gian tên mặc định như các lớp mà bạn muốn sử dụng ở phía máy khách (đối với C#, điều này không quan trọng vì không gian tên được nhúng trong các lớp).

2) Thêm tệp lớp vào dự án làm liên kết để bạn có một bản sao vật lý của lớp.

3) Thêm dataContractSerializer vào cấu hình WCF của bạn nếu bạn chưa có.

4) Ở phía máy khách, nhấp chuột phải vào dịch vụ và chọn Định cấu hình tham chiếu dịch vụ ... Trong hộp thoại kết quả, đảm bảo rằng Reuse types in all referenced assemblies được chọn và tùy chọn Reuse types in all referenced assemblies được chọn.

5) Phần khó nhất để làm việc này là dành cho các bộ sưu tập.

a) Trang trí bộ sưu tập với thuộc tính CollectionDataContract.

b) Thêm mục nhập cho bộ sưu tập này vào bảng CollectionMappings của . Để tìm reference.svcmap, hiển thị tất cả các tệp trong dự án và sau đó mở rộng dịch vụ. Để chỉnh sửa, chỉ cần nhấp đúp vào tệp.Bạn sẽ thêm mục nhập vào đây cho từng bộ sưu tập cụ thể mà bạn đang sắp xếp và bạn cần phân biệt giữa các mục có cơ sở Danh sách <> và những cơ sở có cơ sở từ điển <>. Nếu bạn không thực hiện bước này, WCF sẽ tự động tuần tự hóa các lớp này thành chữ ký chung bên dưới và bạn sẽ mất việc sử dụng các lớp của bạn.

Các mục trong bảng nhìn này một cái gì đó như thế này:

<CollectionMappings> 
    <CollectionMapping TypeName="System.Collections.Generic.Dictionary`2" Category="Dictionary" /> 
    <CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" /> 
    <CollectionMapping TypeName="System.Collections.Specialized.StringCollection" Category="List" /> 
    <CollectionMapping TypeName="My.Namespace.MyDictionaryCollection" Category="Dictionary" /> 

Khi bạn thêm các mục và lưu các tập tin, các máy phát điện client-side WCF sẽ xây dựng lại Reference.cs hoặc tập tin reference.vb tùy thuộc vào ngôn ngữ bạn đang sử dụng. Bạn có thể biết nếu bạn không có tham chiếu được cấu hình đúng bằng cách nhìn vào mã đã tạo: nếu mã đó chứa các định nghĩa lớp, thì trình tạo mã WCF không thể ánh xạ vào các lớp đã sao chép của bạn vì lý do nào đó.

Một lưu ý cuối cùng: đôi khi trình tạo mã WCF hoàn toàn không tạo mã và điều này luôn do sự cố trong dịch vụ (thường là một lớp không phải là duy nhất đủ hoặc loại không thể được tuần tự hóa cho một lý do này hay cách khác).

Để gỡ lỗi loại vấn đề này, điều dễ nhất cần làm là thêm nhật ký chẩn đoán WCF, sẽ tạo tệp có thể được mở bằng công cụ đặc biệt (quên tên của nó) cho phép bạn đi sâu vào các thông báo lỗi và khám phá chính xác những gì đã xảy ra. Điều này đã tiết kiệm cho chúng tôi nhiều giờ làm việc. Để cấu hình khai thác gỗ này, thêm dòng sau vào web.config của bạn bất cứ nơi nào trong <configuration> phần:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\log\WcfTrace.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

Một khi bạn đã thêm này và lưu web.config, cố gắng cập nhật các tài liệu tham khảo phục vụ trong các khách hàng, sau đó nhấp đúp nhấp vào tệp nhật ký bạn đã chỉ định và công cụ sẽ mở.

4

Bạn sẽ cần những thuộc tính đó. Để làm cho cuộc sống của bạn dễ dàng hơn, bạn có thể sử dụng một công cụ như AutoMapper để thực hiện việc kết nối các đối tượng truyền dữ liệu vì cài đặt thủ công của tất cả các thuộc tính có thể tẻ nhạt. Tuy nhiên, thực hành tốt là giữ cho các lớp mô hình riêng biệt với các hợp đồng dữ liệu của bạn để các thay đổi đối với mô hình của bạn không phải trực tiếp tác động đến các hợp đồng dữ liệu của bạn.

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