2010-03-09 11 views
5

मेरे पास कई अनुबंधों के साथ एक सेवा है।डब्ल्यूसीएफ डुप्लिकेट विधि नामों के साथ एकाधिक अनुबंध

[ServiceContract] 
public partial interface IBusinessFunctionDAO { 

    [OperationContract] 
    BusinessFunction GetBusinessFunction(Int32 businessFunctionRefID); 

    [OperationContract] 
    IEnumerable<Project> GetProjects(Int32 businessFunctionRefID); 
} 

[ServiceContract] 
public partial interface IBusinessUnitDAO { 

    [OperationContract] 
    BusinessUnit GetBusinessUnit(Int32 businessUnitRefID); 

    [OperationContract] 
    IEnumerable<Project> GetProjects(Int32 businessUnitRefID); 
} 

मैंने स्पष्ट रूप से इस तरह के इंटरफ़ेस में से प्रत्येक को स्पष्ट रूप से कार्यान्वित किया।

public class TrackingTool : IBusinessFunctionDAO, IBusinessUnitDAO { 

    BusinessFunction IBusinessFunctionDAO.GetBusinessFunction(Int32 businessFunctionRefID) { 
     // implementation 
    } 
    IEnumerable<Project> IBusinessFunctionDAO.GetProjects(Int32 businessFunctionRefID) { 
     // implementation 
    } 

    BusinessUnit IBusinessUnitDAO.GetBusinessUnit(Int32 businessUnitRefID) { 
     // implementation 
    } 
    IEnumerable<Project> IBusinessUnitDAO.GetProjects(Int32 businessUnitRefID) { 
     // implementation 
    } 
} 

आप देख सकते हैं मैं दो GetProjects (int) तरीके है, लेकिन हर एक को स्पष्ट रूप से कार्यान्वित किया जाता है तो यह ठीक संकलित करता है तथा पूरी तरह से वैध है। समस्या तब उत्पन्न होती है जब मैं वास्तव में इसे एक सेवा के रूप में शुरू करता हूं। यह मुझे एक त्रुटि देता है कि TrackingTool में पहले से ही GetProject परिभाषा है। हालांकि यह सच है, यह एक अलग सेवा अनुबंध का हिस्सा है। विधि नाम उत्पन्न करते समय डब्ल्यूसीएफ सर्विस अनुबंधों के बीच अंतर नहीं करता है? क्या यह सेवा अनुबंधों के बीच अंतर करने का कोई तरीका है?

मेरे app.config इस

<service name="TrackingTool"> 
    <endpoint address="BusinessUnit" contract="IBusinessUnitDAO" /> 
    <endpoint address="BusinessFunction" contract="IBusinessFunctionDAO" /> 
</service> 

किसी भी मदद की सराहना की जाएगी तरह दिखता है।

धन्यवाद, राउल

+0

@monO के रूप में उनके उत्तर में उल्लेख किया गया है - वास्तविक व्यक्तिगत विधि नाम आपकी सेवा कक्षा में अद्वितीय होना चाहिए। डब्ल्यूएसडीएल आपके इंटरफेस और सब कुछ के बारे में कुछ भी नहीं जानता है और यह विभिन्न पैरामीटर के साथ विधि अधिभार की अनुमति नहीं देता है; आपको उन सेवा नामों को संपूर्ण सेवा कक्षा में अद्वितीय बनाने की आवश्यकता है! –

+0

आह, मुझे लगता है कि मुझे डब्लूएसडीएल वास्तव में कैसे बनाया गया है इस पर पढ़ना होगा। मैंने सोचा कि प्रत्येक अनुबंध के पास डब्लूएसडीएल के अंदर अपना नामस्थान है। – HaxElit

+0

... असल में मुझे लगता है कि यह भी बहुत भ्रमित है। @marc_s: डब्ल्यूएसडीएल विभिन्न इंटरफेस के बारे में जानता है। उन्हें समर्पित बाइंडिंग के साथ समर्पित बंदरगाहों के रूप में उजागर किया जाता है। – Alex

उत्तर

10

मुझे लगता है कि मुझे इसका कारण मिला है।

<wsdl:message name="IBusinessUnitDAO_GetBusinessUnitProjects_InputMessage"> 
    <wsdl:part name="parameters" element="tns:GetBusinessUnitProjects" /> 
</wsdl:message> 
<wsdl:message name="IBusinessFunctionDAO_GetBusinessFunctionProjects_InputMessage"> 
    <wsdl:part name="parameters" element="tns:GetBusinessFunctionProjects" /> 
</wsdl:message> 
फिर XSD कि टीएनएस को परिभाषित करता है में

: डबल्यूएसडीएल में समारोह के रूप में निम्नलिखित उजागर हो जाता है नाम स्थान हम निम्नलिखित है:

<xs:element name="GetBusinessUnitProjects"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="businessUnitRefID" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="GetBusinessFunctionProjects"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="businessFunctionRefID" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

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

[ServiceContract(Namespace="Tracking/BusinessFunction")] 
public partial interface IBusinessFunctionDAO { 

    [OperationContract] 
    BusinessFunction GetBusinessFunction(Int32 businessFunctionRefID); 

    [OperationContract] 
    IEnumerable<Project> GetProjects(Int32 businessFunctionRefID); 
} 

[ServiceContract(Namespace="Tracking/BusinessUnit")] 
public partial interface IBusinessUnitDAO { 

    [OperationContract] 
    BusinessUnit GetBusinessUnit(Int32 businessUnitRefID); 

    [OperationContract] 
    IEnumerable<Project> GetProjects(Int32 businessUnitRefID); 
} 

जब हम डबल्यूएसडीएल उत्पन्न हम एक नाम स्थान हम बनाने के लिए एक डबल्यूएसडीएल मिलता है। इस नेमस्पेस में प्रत्येक पोर्ट को इसके सभी संचालन और तत्वों के साथ पहचाना गया है। इसलिए हमारे अलग WSDL के में से प्रत्येक के अंदर हम निम्नलिखित मिलती है:

//File: Tracking.BusinessFunction.wsdl 
<wsdl:message name="IBusinessFunctionDAO_GetProjects_InputMessage"> 
    <wsdl:part name="parameters" element="tns:GetProjects" /> 
</wsdl:message> 

//File: Tracking.BusinessUnit.wsdl 
<wsdl:message name="IBusinessUnitDAO_GetProjects_InputMessage"> 
    <wsdl:part name="parameters" element="tns:GetProjects" /> 
</wsdl:message> 

के रूप में आप वे दोनों एक ही तत्व का नाम देख सकते हैं, लेकिन क्योंकि वे विभिन्न नामस्थान तत्वों नहीं रह गया है एक दूसरे के साथ संघर्ष में हैं।अगर हम XSD पर एक नज़र डालें वे अब एक ही तत्व परिभाषित किया गया है, लेकिन विभिन्न मापदंडों के साथ:

//File: Tracking.BusinessFunction.xsd 
<xs:element name="GetProjects"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="businessFunctionRefID" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

//File: Tracking.BusinessUnit.xsd 
<xs:element name="GetProjects"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="businessUnitRefID" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

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

+0

बस एक फॉलो अप, जिस तरह से मुझे लगता है कि इसे काम करना चाहिए, यह है कि यदि एक इंटरफ़ेस स्पष्ट रूप से परिभाषित किया गया है तो उत्पन्न होने वाला तत्व नाम होना चाहिए। यह संदेश भाग तत्वों के साथ टक्कर को खत्म कर देगा। कोई विचार ? – HaxElit

+0

अच्छा है! उस विस्तार में साझा करने के लिए धन्यवाद! – Alex

0

दो तरीकों संघर्ष दूर करने के लिए है, इसलिए जैसे ही नाम है कि के लिए OperationContract विशेषता पर Action संपत्ति सेट करके देखें:

[ServiceContract] 
public partial interface IBusinessFunctionDAO { 

[OperationContract] 
BusinessFunction GetBusinessFunction(Int32 businessFunctionRefID); 

[OperationContract(Action="GetBusinessFunctionProjects")] 
IEnumerable<Project> GetProjects(Int32 businessFunctionRefID); 
} 

[ServiceContract] 
public partial interface IBusinessUnitDAO { 

[OperationContract] 
BusinessUnit GetBusinessUnit(Int32 businessUnitRefID); 

[OperationContract(Action="GetBusinessUnitProjects")] 
IEnumerable<Project> GetProjects(Int32 businessUnitRefID); 
} 
संबंधित मुद्दे