2011-01-20 16 views
6

मेरे पास डब्ल्यूसीएफ सेवाओं के लिए कुछ सेवा व्यवहार हैं जिन्हें मैं अभी पंजीकरण करना चाहता हूं; कोई विन्यास नहीं है।एक सामान्य व्यवहार एक्सटेंशन एक्सटेंशन संभव है?

public class SimpleBehaviorExtensionElement<TBehavior> : BehaviorExtensionElement 
    where TBehavior: new() 
{ 
    protected override object CreateBehavior() 
    { 
     return new TBehavior(); 
    } 

    public override Type BehaviorType 
    { 
     get { return typeof(TBehavior); } 
    } 
} 

और Web.config में:

<behaviorExtensions> 
    <add name="myBehavior2" 
    type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, 
     WcfService1]], WcfService1"/> 
</behaviorExtensions> 

WcfService1.MyBehavior मौजूद है, IServiceBehavior लागू करता है, और परीक्षण किया गया है मुझे लगता है मैं जेनरिक का उपयोग करके एक BehaviorExtensionElement वंशज हर बार बनाने को छोड़ सकता है सोचा।

लेकिन जब मैं संदर्भ < myBehavior2/> कॉन्फ़िग फ़ाइल के व्यवहार अनुभाग में, मैं मिलता है:

system.serviceModel/व्यवहार के लिए विन्यास अनुभाग हैंडलर बनाने में त्रुटि हुई: एक्सटेंशन तत्व 'myBehavior2' इस तत्व में जोड़ा नहीं जा सकता है। सत्यापित करें कि एक्सटेंशन एक्सटेंशन संग्रह system.serviceModel/एक्सटेंशन/व्यवहार एक्सटेंशन पर पंजीकृत है। पैरामीटर नाम: तत्व

सब कुछ करता है, तो मैं एक गैर सामान्य BehaviorExtensionElement वंशज है, जो मैं कर सकते हैं बनाने के काम करता है। लेकिन अब यह मुझे खराब करता है। ;)

उत्तर

2

दुर्भाग्य से यह कम से कम एक विश्वसनीय तरीके से नहीं config फाइलों के साथ संभव नहीं है,।

कारण जब तक आप इसे का उपयोग करके A<B> का एक प्रकार घोषणा करते हैं कि अगर आप एक सामान्य वर्ग class A<T> और एक वर्ग पैरामीटर class B है ढांचा एक वर्ग A<B> बनाने नहीं होगा। प्रारूप A`1 [[B, Assm]] में नाम केवल वह नाम है जो रन टाइम पर बनाया जाता है - इसका मतलब है कि सामान्य "ए" जो निम्न प्रकारों के साथ बनाए गए 1 पैरामीटर लेता है। यह एक प्रकार के कारखाने के लिए एक क्यू नहीं है - जो आप कर रहे हैं उसके लिए आपको जो चाहिए वह है। तो पर काम करने में सक्षम हो अगर आप भाग्यशाली हैं और A<B> घोषित किया गया है, लेकिन मैं इस पर भरोसा नहीं करता।

यह मेरा मानना ​​है कि, फ्रेम अनुबंध के बाद के हिस्सों द्वारा उपयोग किए जाने वाले डेटा अनुबंध क्रमिकरण में तय किया गया है, लेकिन कॉन्फ़िगरेशन पुराना है।आप XAML को देखें, तो वहाँ एक प्रकार के साथ एक प्रकार तर्कों का उपयोग करने की क्षमता है:

<scg3:Dictionary x:TypeArguments="x:String, x:Object"> 

नोट यह एक प्रकार कारखाने के लिए एक स्पष्ट निर्देश है - कुछ config पार्सर करता है कि नहीं है।

तो दुर्भाग्य से इस प्रत्येक विस्तार के लिए एक ठोस प्रकार की घोषणा की कीमत के साथ छोड़ देता है - लेकिन यह बहुत काम नहीं है:

public class MyBehaviorExtensionElement : 
     SimpleBehaviorExtensionElement<MyBehavior> {} 

और प्लस तरफ अपने कॉन्फ़िग फ़ाइल अधिक पठनीय बनाता है।

<behaviorExtensions> 
    <add name="myBehavior" 
    type="BehaviorTest.MyBehaviorExtensionElement, ServiceLibrary"/>  
</behaviorExtensions> 
0

हां, यह संभव है।

मुझे लगता है कि अपवाद को फेंकने का कारण है क्योंकि व्यवहार तत्वों को WCF extensions without including the assembly version जोड़ा जाता है।

जब व्यवहार के प्रकार, संस्करण, संस्कृति और PublicKeyToken विशेषताओं MUST रूप में अच्छी तरह से जोड़ा जा निर्दिष्ट करती है। कृपया यह भी ध्यान दें कि आवश्यक प्रत्येक के बाद बिल्कुल एक स्थान हो, (कॉमा), और गुण उपर्युक्त क्रम में दिखाई दे सकते हैं।

तो, अपने उदाहरण में, निम्नलिखित काम करना चाहिए:

<behaviorExtensions> 
    <add name="myBehavior2" 
     type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, WcfService1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], WcfService1" /> 
</behaviorExtensions> 
+0

ऐसा नहीं है। मेरे पास वर्किंग व्यवहार एक्सटेंशन तत्व हैं जो संस्करण के बिना प्रकार निर्दिष्ट करते हैं। – TrueWill

+0

@TreueWill: मुझे संदेह है कि उनमें से कोई भी कार्य तत्व वास्तव में एक सामान्य है। –

+0

क्या आपने इसे आजमाया है और इसे सामान्य विस्तार के साथ काम करने के लिए सफलतापूर्वक प्राप्त किया है? – TrueWill

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