2009-02-25 34 views
10

Tôi đã đến với rất nhiều kết thúc chết trên câu hỏi này. Giả sử, .NET 3.5 SP1 có hỗ trợ cho các thực thể ADO.NET Entity Framework trong các hợp đồng WCF. Nhưng khi tôi tìm kiếm thông tin chắc chắn về nó, tôi không nhận được nhiều câu trả lời. Tôi tìm thấy đoạn mã này trên một chuỗi MSDN. Có ai có bất cứ kinh nghiệm với điều này? Điều gì đã xảy ra với [DataContract]? Đây có phải là tất cả để có nó? Tại sao có rất ít tài liệu về điều này?Hợp đồng WCF từ Khung thực thể?

Câu trả lời này từ Tim Mallalieu trong Microsoft.

Các loại thực thể được tạo trong Khuôn khổ thực thể, theo mặc định Hợp đồng dữ liệu. Nếu tôi tạo một mô hình đơn giản trong Trình thiết kế thực thể như sau: Loại thực thể giỏ hàng theo mặc định là DataContract với tất cả các thuộc tính được chú thích là thành viên dữ liệu. Sau đó chúng tôi có thể sử dụng điều này trong một dịch vụ WCF như sau:

[ServiceContract] 

public interface IService1 

{ 
    [OperationContract] 
    Cart[] AllCarts(); 
} 



public class Service1 : IService1 

{ 
    public Cart[] AllCarts() 

    { 
     using (MSPetShop4Entities context = new MSPetShop4Entities()) 

     { 
      var carts = from c in context.Carts select c; 
      return carts.ToArray(); 
     } 
    } 
} 

Như Entities là DataContracts bây giờ bạn có thể cuộn dịch vụ của bạn như bạn thấy phù hợp và gửi những qua dây dẫn.

Trả lời

1

Bạn có thể đi một cách dễ dàng và sử dụng ADO.NET Data Services.

+0

Cuối cùng tôi đã làm chính xác điều đó. Tôi hy vọng nó không phải là một sai lầm trong thời gian dài. Nhược điểm tôi thấy cho đến nay là tôi đã kết thúc việc thực hiện một mô hình kho lưu trữ ở phía khách hàng chứ không phải ở phía mô hình. Tôi không hài lòng về điều đó và có lẽ sẽ phải tái cấu trúc lại sau này. – Weej

+0

Sự nguy hiểm của dịch vụ dữ liệu ADO.NET là nó có thể được khá khó khăn để làm theo một cách tiếp cận DDD. Bạn nên xử lý các dịch vụ dữ liệu ADO.NET như là: các dịch vụ dữ liệu. Nếu bạn cần một tập hợp các dịch vụ mô hình mạnh hơn, bạn sẽ cần phải tạo riêng các dịch vụ đó. –

+0

Ngay cả với phiên bản mới nhất của ADO .NET Data Services và EFCF 4.1, nó vẫn còn hạn chế nghiêm trọng. Ví dụ, không có toán tử tổng hợp nào từ LINQ được hỗ trợ, bao gồm 'Distinct()'. Nếu bạn cần bất cứ điều gì nhiều hơn các chức năng của CRUD, bạn nên tránh xa các Dịch vụ Dữ liệu. – Yuck

6

Tôi khuyên bạn không nên trả lại trực tiếp các đối tượng. Thật không may, Microsoft đã chọn để bao gồm dữ liệu thực hiện cụ thể như một phần của DataContract cho các thực thể. Điều này sẽ không tương thích với các nền tảng khác và là loại điều có thể không tương thích ngay cả giữa các phiên bản .NET.

Thay vào đó, tôi khuyên bạn nên làm theo mẫu Đối tượng chuyển dữ liệu và chỉ trả về các lớp POCO là bản sao của dữ liệu trong thực thể, không có hành vi. Bạn có thể trả về Danh sách các lớp như vậy để đại diện cho một bảng, v.v.

+0

Tôi đã xem xét điều này nhưng tâm trí boggles tại bao nhiêu công việc này có thể phải chịu. Từ khuôn mặt của nó, mã đơn giản ở trên dường như không làm mờ sự phân tách các mối quan tâm. Nếu tôi chấp nhận EF, tôi không phải là một xu, cho một pao '? Nói cách khác, tôi đã ra khỏi lãnh thổ POCO. Không? – Weej

+0

OK John, xin lỗi tôi đã bỏ lỡ quan điểm của bạn. Bạn đang nói rằng đối tượng được trả về có 'các thứ khác' bên cạnh dữ liệu đơn giản. Điều đó không tốt. Có cách nào tốt đẹp mà bạn đã đưa ra sẽ tạo ra các báo cáo hợp đồng DTO? – Weej

+0

Một phần của tôi muốn MS cung cấp một tập hợp con của WCF ít tương thích hơn, nhưng nhiều thực thể dữ liệu hơn, LINQ, vv thân thiện, nhưng sau đó bất cứ điều gì như thế vẫn còn thêm khớp nối mà tôi không chắc chắn là một ý tưởng hay ... –

3

Nguyên lý "chia sẻ giao diện và không loại" giả định rằng bạn không sở hữu cả hai đầu của dây và/hoặc bạn đang viết công khai dịch vụ web. WCF có thể được sử dụng (và được sử dụng) trong các bối cảnh mà đây là quyết định không phải là trường hợp. Nhiều kiến ​​trúc n-tier của doanh nghiệp có một tầng ứng dụng WCF để tạo điều kiện cân bằng tải trong số những thứ khác. Trong những trường hợp này, nó là hoàn toàn hợp lệ để chia sẻ loại và, trên thực tế, là mong muốn.

1

Một số chi tiết khác để trả lời nhận xét:

Có một số vấn đề với lớp học do EF tạo ra. Bây giờ tôi đang tìm kiếm một ví dụ AdventureWorks với SalesOrderHeader và SalesOrderDetail. Thực thể SalesOrderDetail có cả thuộc tính "SalesOrderHeader" và "SalesOrderHeaderReference", cả hai đều được đánh dấu là DataMembers. Điều này trông giống như một lỗi, vì thuộc tính "SalesOrderHeader" cũng được đánh dấu [XmlIgnore] và [SoapIgnore].

Ngoài ra, hãy cân nhắc xem bạn có muốn tuần tự hóa liên kết trở lại với SalesOrderHeader gốc ở vị trí đầu tiên không. Bên cạnh đó, những gì chính xác nên được serialized? SOAP không hỗ trợ các tham chiếu theo cách tương thích.

Cuối cùng, các lớp cơ sở của các thực thể cũng là hợp đồng dữ liệu. Tuy nhiên, họ không có gì để làm với các dữ liệu bạn đang trở về - họ hoàn toàn là một hiện vật thực hiện.

Tóm lại, Microsoft đã sửa lỗi này. Họ không nghĩ vậy.

Giới thiệu về cách tạo các lớp DTO, tôi khuyên bạn nên xem xét các công cụ tạo mã khác nhau, như CodeSmith. Bạn có thể viết mã để tự làm điều này; Tôi đã làm như vậy ở vị trí trước đây của tôi.Điều tốt đẹp về việc tạo DTO là bạn cũng có thể tạo ra các phương thức để dịch và từ DTO.

Như trên đầu, chi phí di chuyển một số dữ liệu xung quanh trong bộ nhớ là không có gì so với lượng thời gian cần thực hiện để gửi dữ liệu qua mạng!

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