2009-06-23 13 views
6

उदाहरण के लिए मेरे पास आईआईएस में दो सेवाएं आयोजित की गई हैं।विभिन्न अनुबंधों के साथ दो डब्ल्यूसीएफ सेवाएं लेकिन एक ही व्यावसायिक वस्तुएं

[ServiceContract] 
public interface IDeviceService 
{ 
    [OperationContract] 
    DeviceCollection GetAllDevices(Customer customer); 

} 

[ServiceContract] 
public interface IUserService 
{ 
    [OperationContract] 
    User Authenticate(string username, string password); 

} 

दोनों उपयोगकर्ता उद्देश्य यह है कि UserService में प्रमाणित आपरेशन से लौट आता है और DeviceCollection कि DeviceService में GetAllDevices आपरेशन से लौटे होने के बाद ग्राहक का एक बच्चा वस्तु परिभाषा नहीं है। ग्राहक एक व्यावसायिक वस्तु है जो उपयोगकर्ता और डिवाइस ऑब्जेक्ट्स के समान असेंबली में है।

मेरे समस्या क्लाइंट पर है - जब मैं डिवाइस आपरेशन फोन

userProxy.GetAllDevices(user.Customer); 

संकलक निम्न संदेश के साथ शिकायत:

तर्क 1 - UserService.Customer से कनवर्ट नहीं कर सकता DeviceService.Customer को

मैं दोनों सेवाओं को ठीक से जोड़ सकता हूं, यह ग्राहक की ऑब्जेक्ट परिभाषा है जो समस्या है। मैं वास्तव में ऑपरेशंस को उसी सेवा में नहीं रखना चाहता क्योंकि वे स्वाभाविक रूप से अपनी सेवाओं में रहते हैं। मुझे लगता है कि मैं क्या पूछ रहा हूं कि अन्य प्रोग्रामर इस तरह की समस्या से कैसे निपटते हैं?

चीयर्स, स्टुअर्ट

उत्तर

3

आप एक से अधिक सेवाओं पर डेटा अनुबंध साझा करना चाहते हैं तो आप अपनी ही विधानसभा में प्रश्न में डेटा अनुबंध संकलन और उसके बाद ग्राहक के लिए है कि विधानसभा वितरित करने के लिए होगा।

भले ही दिखाई देने के लिए प्रतीत होता है, वास्तव में यह दो अलग-अलग प्रकार हैं और यही कारण है कि आप जो त्रुटि देख रहे हैं उसे देख रहे हैं। आपकी एकमात्र अन्य पसंद (एक अलग, साझा असेंबली के अलावा) दोनों सेवाओं को एक साथ जोड़ना है ताकि वे डेटा अनुबंध साझा कर सकें।

+2

इसके अतिरिक्त, जब आप सेवा संदर्भ जोड़ते हैं, तो आप निर्दिष्ट टैब का उपयोग करना चाहते हैं यह निर्दिष्ट करने के लिए कि किस प्रकार को साझा किया जाना चाहिए। –

+0

हाय, दो सेवाओं के संयोजन के साथ समस्या यह है कि वे अंततः बड़े पैमाने पर बनने जा रहे हैं। मैंने ज्यूल लोरीस बुक में पढ़ा है कि आपको सेवा अनुबंध के 12 सदस्यों के पास और प्रयास करने का प्रयास करना चाहिए? – Simian

+0

@ स्टुअर्ट - मैं इस कारण से केवल सेवाओं को संयोजित करने की अनुशंसा नहीं करता। मुझे भरोसा है कि आपकी सेवाएं उद्देश्य से अलग हो गई हैं, इसलिए उन्हें एक साथ जोड़ना हमेशा समझ में नहीं आता है। मैं बस यह सुनिश्चित करना चाहता था कि आप हर विकल्प के बारे में जानते हों। –

0

मैंने सोचा कि मैं इस समाधान के बारे में विवरण के साथ अपने स्वयं के प्रश्न का उत्तर देने का प्रयास करूंगा। यह blog article by Dan Meineck पर एक लेख पर आधारित था।

सारांश है, मुझे लगता है कि मेरी प्रत्येक मूल व्यापार संस्थाओं के लिए कई सेवाओं की मेरी अवधारणा गुमराह थी।

इसके बजाय मैं एक ही सेवा है जो लागू किया कई DataContracts जैसे

public partial class DeviceService : IDeviceService, IUserService 
{ 
} 

क्योंकि डिवाइस सेवा एक आंशिक वर्ग यह मेरे सेवाओं को अलग करने की अनुमति के रूप में बनाई गई है अवगत कराया, अच्छी तरह से मैं कहता हूँ अलग, वे अभी भी एक ही सेवा कर रहे हैं लेकिन यह मुझे अलग फाइलों में अलग करने और सेवा के लिए कुछ संरचनात्मक संगठन देने की अनुमति दी।

कार्यान्वयन के अंतिम टुकड़ा समाधान सेवा परिभाषा जैसे

<service behaviorConfiguration="GPSCloudHost.DeviceServiceBehavior" name="BusinessService.DeviceService"> 
<endpoint address="Device" binding="wsHttpBinding" contract="BusinessService.DataContracts.IDeviceService"></endpoint> 
    <endpoint address="User" binding="wsHttpBinding" contract="BusinessService.DataContracts.IUserService"></endpoint> 
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

मैं WCF में अनुभवी नहीं कर रहा हूँ अगर यह 'सही' है कहने के लिए enought में दो अंत अंक घोषित करने के लिए था या नहीं, लेकिन यह मेरी आवश्यकताओं के लिए एक इलाज कर रहा है। अगर किसी और के पास एक बेहतर समाधान है तो मुझे यह सुनना अच्छा लगेगा!

चीयर्स

+0

जो कुछ मैं करता हूं ... लेकिन मैं क्लाइंट और सर्वर पर सेवा अनुबंध साझा करना चाहता हूं - हालांकि मुझे लगता है कि यह गुमराह हो सकता है। –

0

यह एक अर्थ मुद्दा है। यदि आप एक उपयोगकर्ता सेवा को परिभाषित करना चाहते हैं।ग्राहक और डिवाइस सेवा। ग्राहक को समान रूप से बराबर के रूप में, तो आपको भौतिक रूप से एक अलग असेंबली में डेटा अनुबंध को फिर से कारक बनाना चाहिए। वैकल्पिक रूप से, यदि आप UserService.Customer और DeviceService.Customer को अर्थपूर्ण रूप से अलग करना चाहते हैं, तो उन्हें अलग-अलग प्रकार के रूप में रखें और एक से दूसरे में अनुवाद करने के लिए उपयोगिता फ़ंक्शन लिखें।

+0

मैं चाहता हूं कि वे सैद्धांतिक रूप से बराबर हों, जैसे डोमेन में। ग्राहक और उपयोगकर्ता। ग्राहक एक ही इकाई हैं। सेवा परिभाषा और अनुबंध के लिए कोड एक ही असेंबली में हैं, जो मैं कहने का प्रयास कर रहा था वह यह है कि मैं इन सेवाओं को एक ही सेवा के रूप में कैसे उजागर कर सकता हूं, और ऐसा लगता है कि उत्तर एक ही सेवा पर कई अंतराल का उपयोग करता है। – Simian

2

एक विकल्प क्लाइंट पर AutoMapper का उपयोग करना होगा ताकि एक प्रकार से दूसरे में सहजता से परिवर्तित हो सके। चूंकि उनके पास समान गुण मैपिंग सरल हैं।

संबंधित मुद्दे