2010-02-24 6 views
19

Tôi đang xây dựng một bộ các dịch vụ WCF chia sẻ các hợp đồng dữ liệu chung (hoặc các thực thể nếu bạn thích). Đây là những đối tượng chuyển dữ liệu đơn giản được trang trí với các thuộc tính DataContract và DataMember. Tôi chỉ định rõ tên và không gian tên. Trong cố gắng tuân theo các nguyên tắc của khuyến cáo của IDesign về trung bình 12 thành viên cho mỗi hợp đồng dịch vụ, tôi đang phá vỡ dự án dịch vụ của tôi thành nhiều dịch vụ.Nhiều dịch vụ WCF tham chiếu cùng một hợp đồng dữ liệu

Hợp đồng dữ liệu của tôi nằm trong một hội đồng riêng biệt mà tôi có thể cung cấp cho khách hàng của mình nếu họ đang sử dụng .Net. Họ có thể cho biết tài liệu tham khảo dịch vụ của họ để sử dụng lại các loại trong hội đồng tham chiếu. Tuy nhiên, nếu họ không sử dụng .net và họ sử dụng 2 dịch vụ mà cả hai đều sử dụng cùng một thực thể thì họ sẽ, tôi giả sử, nhận được một thông điệp tham khảo mơ hồ. Tôi có thể thấy điều này trong Visual Studio nếu tôi không tham khảo dll hợp đồng dữ liệu.

Câu hỏi của tôi là, có bất kỳ điều gì tôi có thể làm trong các dịch vụ của mình không, hoặc họ có thể làm trong ứng dụng khách để tránh phải hội đủ điều kiện hợp đồng dữ liệu đến từ đâu?

+0

Tôi gặp vấn đề tương tự. Tôi đã cố gắng sử dụng lời khuyên trong bài viết dưới đây, nhưng không có niềm vui. Tuy nhiên, tôi đang sử dụng các dịch vụ WCF RESTful (điều này có thể có liên quan đến phương thức bên dưới không hoạt động), vì vậy tôi đã chỉ tham chiếu một DLL thông thường có chứa các hợp đồng dữ liệu của tôi. Vì tôi gọi các dịch vụ của mình bằng cách sử dụng các yêu cầu web HTTP đơn giản, tôi không thực sự cần các tham chiếu dịch vụ trong dự án. – Nick

Trả lời

2

Tôi cũng có xu hướng giữ tất cả các hợp đồng dữ liệu trong một assembly được tham chiếu bởi nhiều dịch vụ và nhiều ứng dụng khách, hoạt động tốt nhưng tôi chưa bao giờ thử dùng dịch vụ bên ngoài .NET.

Có thể hữu ích khi biết công nghệ nào họ đang sử dụng để sử dụng dịch vụ khác với .NET? Điều gì đang ném thông điệp tham khảo tuyệt vời?

+0

Bạn có thể làm điều đó trong .net, chỉ cần không tham khảo dll hợp đồng dữ liệu của bạn và xem những gì sẽ xảy ra. Tạo một dự án thử nghiệm, thêm 2 trong số các dịch vụ của bạn mà cả hai đều sử dụng một hợp đồng dữ liệu chung làm tài liệu tham khảo và bạn sẽ nhận được thông báo mơ hồ. –

0

Tôi tình cờ có nhiều dịch vụ chia sẻ các đối tượng trên đầu của tôi. Tôi không chắc chắn tại sao bạn gặp vấn đề này. Trong trường hợp của tôi, tôi có thể truy cập các đối tượng theo cách này. . . .

SERVICE1 client = new SERVICE1()

client.CommonLibrary.Address. . .

SERVICE2 client2 = new SERVICE2()

client2.CommonLibrary.Address. . . .

+0

Điều đó cũng phù hợp với tôi. Vấn đề là họ là 2 đối tượng khác nhau. Ứng dụng tiêu thụ không thể chỉ nói CommonLibrary.Address, nó phải đủ điều kiện với tên dịch vụ. Đây không thực sự là một vấn đề, tôi chỉ tự hỏi liệu các tài liệu tham khảo dịch vụ có phát hiện cùng một không gian tên cho các hợp đồng dữ liệu chung hay không và chia sẻ nó. –

0

Từ hiểu biết của tôi và làm việc với WCF, hoặc là một trong những hợp đồng dữ liệu được sử dụng bởi các ứng dụng khách hàng sẽ không quan trọng miễn là tên đầy đủ là như nhau và có các thành viên cùng một dữ liệu. Bên trong nó chỉ tạo đối tượng động và gán lại các thuộc tính thành viên dữ liệu đó bằng cách sử dụng công cụ setter công cộng.

Một cách tiếp cận tốt hơn tôi nghĩ là tái cấu trúc hợp đồng dữ liệu của bạn để bạn đặt tất cả các dịch vụ phổ biến trên nhiều dịch vụ vào một assembly và tham khảo chúng, do đó bạn sẽ không gặp phải vấn đề xung đột hoặc xung đột này được ứng dụng khách sử dụng.

+0

Fadrian, tất cả các hợp đồng dữ liệu của tôi đều được lắp ráp. Vấn đề là nếu 2 dịch vụ tham chiếu cùng một hợp đồng dữ liệu, mỗi dịch vụ sẽ có phiên bản không gian tên riêng của nó. –

+0

Paul, bạn đã thử xác định rõ ràng vùng tên trong thuộc tính DataContract chưa? và làm thế nào bạn tạo ra một hợp đồng dữ liệu? Bạn đã thử sử dụng công cụ svcutil và tự tạo điều khiển dữ liệu với tham số/namespace:? Cá nhân tôi đã có vấn đề đó vì vậy tôi có thể không nhấn nút bên phải, chỉ cần chia sẻ một số suy nghĩ ở đây. –

0

Chúng tôi tạo proxy dịch vụ không thông qua trợ lý Visual Studio mà theo các tệp lô tùy chỉnh gọi slsvcutil.exe (như chúng tôi sử dụng Silverlight).Ở đó bạn có thể chỉ định một ánh xạ tên miền không gian sử dụng tham số/n như thế này:

"C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\tools\slsvcutil.exe "^ 
http://ServiceUrl/MyService.svc^ 
**/n:http://youruri.org/CustomerService/DataContracts,CLR.Namespace.CustomerService^** 
/n:*,CLR.Namepsace.MyService^ 
/r:"%ProgramFilesFolder%\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0\System.Windows.dll"^ 
/ct:System.Collections.ObjectModel.ObservableCollection`1^ 
/edb^ 

Vì vậy, tất cả các hợp đồng dữ liệu có namespace http://youruri.org/CustomerService/DataContracts phát sinh tới CLR.Namespace.CustomerService clr namespace trong file proxy và vân vân. Do bạn đã tạo proxy này trước trong cùng một assembly proxy, bạn có thể cắt toàn bộ không gian tên này ra khỏi tệp thứ hai của mình và mọi thứ hoạt động tốt - chúng tôi đã viết một công cụ nhỏ cho bước cuối cùng. Tất cả các không gian tên hợp đồng khác sẽ được tạo ra cho không gian tên CLR.Namepsace.MyService (xem ý nghĩa dấu hoa thị bắt tất cả)

Quá trình này được thiết lập vì bạn phải tạo thủ công các tệp lô, nhưng một khi điều này được thực hiện nó hoạt động tốt.