2008-10-21 36 views
5

Tôi có tất cả các thực thể của mình trong một dự án riêng biệt trong tệp edmx của tôi và tôi hiển thị chúng cho ứng dụng khách của tôi bằng dịch vụ WCF.LINQ to Entities with WCF

Điều đó có nghĩa là tôi không phải cung cấp cho ứng dụng khách hàng của mình liên kết trực tiếp đến dự án chứa tệp edmx. Điều đó sẽ là xấu bởi vì nó contines đối tượng để truy vấn cơ sở dữ liệu với.

Nhưng chỉ những thực thể mà dịch vụ WCF của tôi sử dụng mới có thể truy cập được từ ứng dụng khách của tôi. Vì vậy, ví dụ bởi vì tôi có đoạn mã sau trong dịch vụ của tôi:

public MyClass GetMyClass() 
{ 
    return new MyClass(); 
} 

.. Tôi có thể sử dụng MyClass truy cập trong ứng dụng của khách hàng của tôi với một cái gì đó như:

myServiceInstance.MyClass cls = new myServiceInstance.MyClass() 

gì về nếu tôi có một tổ chức gọi là MyClass2 trong tệp edmx của tôi mà tôi muốn sử dụng trong ứng dụng khách của mình! Làm thế nào để tôi instansiate nó mà không cho khách hàng của tôi một liên kết trực tiếp đến dự án tập tin edmx của tôi hoặc làm cho một phương pháp vô dụng trong lớp dịch vụ của tôi mà trả về MyClass2

Những người khác đang làm gì?

Cảm ơn rất nhiều

+0

Nếu bạn muốn hiển thị đoạn mã theo định dạng khác, dễ phân biệt hơn, hãy chỉnh sửa câu hỏi, chọn văn bản mã và nhấp vào biểu tượng với 01010 bên cạnh dấu ngoặc kép khổng lồ. – DOK

Trả lời

2

Nếu dịch vụ WCF không sử dụng dịch vụ này, bạn muốn làm gì? Một dịch vụ WCF (chính nó) là hoàn toàn cho vận chuyển dữ liệu - cách tiếp cận "mex" cho siêu dữ liệu không chia sẻ mã, vì vậy MyClass2 của bạn sẽ bất lực. Nếu bạn muốn, bạn có thể sử dụng chia sẻ lắp ráp tại máy khách, nhưng tôi thực sự không khuyến nghị điều này trong trường hợp này; Các đối tượng EF tại khách hàng là một mớ hỗn độn ... (cộng với nó sẽ không hoạt động trên các khung công tác nhẹ như Silverlight, Hồ sơ khách hàng, Compact Framework, v.v.)

Một tùy chọn khác là ADO.NET Data Services; điều này hoạt động trên WCF, nhưng cung cấp cho bạn một API LINQ thân thiện hơn so với cách tiếp cận WCF thông thường - và bất kỳ đối tượng miền nào mà mô hình của bạn phơi bày sẽ có sẵn trên ngữ cảnh dữ liệu của máy khách.

3

Chúng tôi tạo ra một dự án riêng biệt với miền Lớp Chuyển Object mà phục vụ như hợp đồng dữ liệu cho nhiều dịch vụ WCF nội bộ của chúng tôi. Sau đó, chúng tôi đã chia sẻ dự án hợp đồng với các dịch vụ nội bộ đó. Chúng tôi đã có một dịch vụ dữ liệu; những phương thức này sẽ dịch các đối tượng miền này sang/từ các đối tượng thực thể trước/sau khi lưu trữ/truy xuất. Trong khi đó, các dịch vụ bên ngoài sử dụng các proxy chuẩn được tạo từ các tệp XSD và WSDL và được dịch sang/từ mô hình chuyển tên miền được chia sẻ.

Chúng tôi phải làm điều này bởi vì ngữ cảnh đối tượng không phải là (chưa) di động qua WCF, thật không may.

Một số cân nhắc cho tình hình của bạn:

  1. Nếu ứng dụng của khách hàng của bạn là bên ngoài để hệ thống của bạn, nó không nên biết gì về EDMX của bạn hoặc các lớp học của mình. Nó chỉ nên biết về WSDL và XSD của bạn.
  2. Nếu ứng dụng khách của bạn là nội bộ, thì không sử dụng chia sẻ các lớp thực thể trong EF v1 vì nó chưa được hỗ trợ đúng cách. Bạn cần phải chuyển nhiều hơn là chỉ các lớp/đối tượng - bạn cũng cần bối cảnh, mà duy trì theo dõi thay đổi, và nó không thể được thực hiện thông qua WCF trực tiếp ngay bây giờ.
1

Nếu bạn muốn thực hiện theo cách "thích hợp", bạn nên tạo các lớp đặc biệt cho thư của bạn đang đi qua dây, thay vì cố gắng sử dụng lại các thực thể kinh doanh hoặc đối tượng dữ liệu dưới dạng tin nhắn. Giá trị trong điều này là bạn được tự do thay đổi các thực thể kinh doanh và các đối tượng dữ liệu mà không phải lo lắng về hợp đồng mà bạn đã tiếp xúc với người tiêu dùng thay đổi. Mọi thay đổi đối với dịch vụ của bạn sẽ thận trọng hơn một chút vì nó xảy ra độc lập với những thay đổi về dữ liệu và logic nghiệp vụ. Một cách khác để xử lý việc này đơn giản là sử dụng svcutil (hoặc "Thêm tham chiếu dịch vụ ...". Svcutil hoạt động tốt hơn cho nhiều điểm cuối dịch vụ) để tạo tất cả các lớp mà khách hàng sẽ sử dụng thay vì thêm tham chiếu vào dự án máy chủ. Bằng cách đó, các lớp duy nhất mà khách hàng của bạn sẽ thấy là những lớp mà dịch vụ tiếp xúc.

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