2009-05-18 16 views

उत्तर

8

यह codeplex साइट पर एक मुद्दा रहा है, तो आप यहाँ से पा सकते हैं (कि धागा के निचले भाग में देखने के लिए और वे एक विस्तार विधि ... बहुत आसान बना दिया है)

http://unity.codeplex.com/Thread/View.aspx?ThreadId=24543

इस तरह

और आप उपयोग कर सकते हैं कोड:

if (container.CanResolve<T>() == true) 
{ 
    try 
    { 
     return container.Resolve<T>(); 
    } 
    catch (Exception e) 
    { 
     // do something else 
    } 
} 

CanResolve कि विस्तार विधि है। मैं वास्तव में इस तरह कंटेनर के निर्माण पर उस एक्सटेंशन को पंजीकृत कर रहा हूँ ... कुछ:

private void CreateContainer() 
{ 
    ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 

    map.ExeConfigFilename = // path to config file 

    // get section from config code goes here 

    IUnityContainer container = new UnityContainer(); 
    container.AddNewExtension<UnityExtensionWithTypeTracking>(); 
    section.Containers.Default.Configure(container);   
} 
3

ऐसा लगता है कि इसमें इस सुविधा की कमी है। This article इसे लागू करने के लिए प्रयास/पकड़ ब्लॉक में संकल्प विधि को संलग्न करने का उदाहरण दिखाता है।

public object TryResolve(Type type) 
{ 
    object resolved; 

    try 
    { 
     resolved = Resolve(type); 
    } 
    catch 
    { 
     resolved = null; 
    } 

    return resolved; 
} 
+0

महान उत्तर के लिए धन्यवाद। मुझे यकीन नहीं था कि मेरा प्रश्न स्पष्ट था लेकिन आपका जवाब वही है जो मैं ढूंढ रहा था। – Vadim

1

यह वर्तमान रिलीज में उपलब्ध नहीं है। हालांकि, आप सी # 3 में एक्सटेंशन विधियों का उपयोग करके हमेशा "अपना खुद का रोल" कर सकते हैं। एक बार यूनिटी इसका समर्थन करता है, तो आप एक्सटेंशन विधि को छोड़ या अपडेट कर सकते हैं।

public static class UnityExtensions 
{ 
    public static T TryResolve<T>(this UnityContainer container) 
     where T : class 
    { 
     try 
     { 
      return (T)container.Resolve(typeof(T)); 
     } 
     catch(Exception) 
     { 
      return null; 
     } 
    } 
} 
+6

कार्यात्मक लेकिन महंगा। अपवाद पकड़ना और वापस लौटना एक अच्छा अभ्यास नहीं है। –

14

भी ध्यान रखें कि, अगर आप Unity 2.0 उपयोग कर रहे हैं आप नए IsRegistered() विधि का उपयोग कर सकते हैं और यह generic version रूप में अच्छी तरह है।

+8

एक [बड़ी चेतावनी] (https://unity.codeplex.com/discussions/392550) IsRegistered विधि के बारे में: यह केवल डीबगिंग के लिए है क्योंकि यह कुख्यात रूप से धीमा है! इसमें ओ (एन) की एक प्रदर्शन विशेषता है और पूरी तरह से आपके आवेदन के प्रदर्शन को डूब सकता है। – Steven

0

प्रिज्म एकता 5 में, वे TryResolve समारोह है कि नाम स्थान Microsoft.Practices.Prism.UnityExtensions में शामिल किया गया के साथ आए हैं।

संदर्भ के लिए कृपया इस लिंक https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx पर जाएं।

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