2012-05-18 12 views
29

मैं अब AutoMapper कोड को देख रहा हूँ (परियोजनाओं मैं पर काम कर रहा हूँ में से एक के लिए यह मूल्यांकन करने), और, स्पष्ट रूप से कहा जाए तो मैं काफी हैरान हूँ:MapMap.Map ऑटोमैपर थ्रेड-सुरक्षित में है?

  • पुस्तकालय एपीआई एक भी स्थिर पर आधारित है एक्सेस पॉइंट (Mapper प्रकार), इसलिए आम तौर पर इसके किसी भी तरीके को थ्रेड सुरक्षित होना चाहिए
  • लेकिन मुझे कोड में इसका कोई सबूत नहीं मिला।

सभी मुझे लगता है करने में सक्षम था this issue है, लेकिन फिर भी बयान वहाँ लगता है गलत किया: अगर Map धागे की सुरक्षित डाटा संरचनाओं आंतरिक रूप से, यह धागा सुरक्षित करने के साथ ही नहीं माना जा सकता का उपयोग नहीं करता, अगर मैं गैर-समवर्ती संदर्भ में CreateMap पर कॉल करने जा रहा हूं, लेकिन समसामयिक रूप से Map के साथ।

आईई। उदाहरण में ऑटोमैपर का एकमात्र संभावित उपयोग पैटर्न एएसपी.नेट एमवीसी एप्लीकेशन है:

lock (mapperLock) { 
    ... Mapper.AnyMethod(...) ... 
} 

जाहिर है, अगर मैं सही हूं, तो यह एक बड़ी कमी है।

  • मैं सही हूँ:

    तो मैं दो प्रश्न हैं?

  • यदि हां, तो ऑटोमैपर का सबसे अच्छा विकल्प क्या है जिसमें यह समस्या नहीं है?
+0

मुख्य कुंजी लगता है कि 'थ्रेडसेफलिस्ट _typeMaps' के माध्यम से डबल-चेक लुकअप है; आपको क्या लगता है कि यह थ्रेड-सुरक्षित नहीं है? क्या *** विशेष रूप से *** क्या आपको विश्वास है कि थ्रेड-सुरक्षित नहीं है? –

+0

टाइपमैप एक अपरिवर्तनीय वस्तु है? –

+0

तुम मुझे बताओ! (और प्रश्न भी हैं: यहां तक ​​कि यदि यह नहीं है, तो यह आपके द्वारा किसी अन्य बिंदु पर अनुपयुक्त रूप से अपडेट किया गया है)। आपने दावा किया है कि यह थ्रेड-सुरक्षित नहीं है; कृपया जो भी आपको लगता है उस पर विस्तार से सुरक्षित न हों। ध्यान दें कि आम तौर पर रणनीति (एक बार निर्मित) अद्यतन नहीं होती है, इसलिए केवल एक चीज जिसे सुरक्षा की आवश्यकता होती है वह रणनीति-कैश तक पहुंच है, जो सही तरीके से किया जाता है। –

उत्तर

32

जुड़ा हुआ issue कम या ज्यादा अपने सवालों के जवाब:

Mapper.CreateMap threadsafe नहीं है, न ही यह कभी नहीं होगा। हालांकि, Mapper.Map थ्रेड-सुरक्षित है। मैपर स्टेटिक क्लास मैपिंगइंजिन और कॉन्फ़िगरेशन ऑब्जेक्ट्स के शीर्ष पर केवल पतली रैपर है।

तो केवल Mapper.CreateMap उपयोग करें यदि आप एक threadsafe ढंग से एक केंद्रीय स्थान में आपके विन्यास है।

आपकी टिप्पणी थी:

मैं इस पूछ रहा हूँ क्योंकि मैं सही उपयोग से पहले यथा-स्थान automatter कॉन्फ़िगर करने के लिए, अर्थात चाहते हैं। मैंने इसे गैर-समवर्ती संदर्भ में कॉन्फ़िगर करने की योजना बनाई, यानी ~ लॉक (मैपर कॉनफिग लॉक) {Mapper.CreateMap() ....; }, और मुझे डर है कि यह अब पर्याप्त नहीं है।

यदि आप इन-प्लेस कॉन्फ़िगरेशन कर रहे हैं तो बस स्थिर Mapper कक्षा का उपयोग न करें।

var config = 
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 
config.CreateMap<Source, Destination>(); 
var engine = new MappingEngine(config); 

var source = new Source(); 
var dest = engine.Map(source); 

यह अधिक कोड का एक छोटा सा है, लेकिन आप इसके चारों ओर अपने स्वयं के सहायकों बना सकते हैं: GitHub मुद्दे पर टिप्पणी सीधे मानचित्रण इंजन का उपयोग करने का सुझाव के रूप में। लेकिन सबकुछ किसी दिए गए तरीके से स्थानीय है इसलिए कोई साझा स्थिति थ्रेड सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है।

+0

साफ़ करें, बहुत बहुत धन्यवाद! –

+0

'थ्रेडसेफ तरीके से एक केंद्रीय स्थान' - मुझे लगता है कि इस मुद्दे में इसे किसी भी तरह समझाया जाना चाहिए, क्योंकि संभावित गलतियों के लिए बहुत सारे कमरे हैं। –

+0

@nemesv - बहुत धन्यवाद, आपका समाधान वास्तव में सहायक है! – Ronnix

0

यह प्रश्न थोड़ा पुराना हो सकता है, बस थोड़ी सी जांच के बाद मेरे कुछ निष्कर्ष रिकॉर्ड करना चाहते हैं।

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

MapperConfiguration मैपर का नया उदाहरण बनाएं, और कॉन्फ़िगरेशन को अपने स्वयं के इंस्टेंस मेमोरी स्पेस के अंदर रिकॉर्ड करें।

टीएलडीआर;

आप केवल एक बार विन्यास init की जरूरत है, स्थिर एपीआई

चुनें आप विन्यास कई बार init की जरूरत है, और धागा सुरक्षा के बारे में चिंता, चुनें उदाहरण एपीआई

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

  • कोई संबंधित समस्या नहीं^_^