2009-05-18 18 views
13

Come posso fare Unity per non lanciare ResolutionFailedException se Resolve fallisce?Esiste TryResolve in Unity?

C'è qualcosa come TryResolve<IMyInterface>?

var container = new UnityContainer(); 
var foo = container.TryResolve<IFoo>(); 
Assert.IsNull(foo); 

risposta

8

Questo è stato un problema sul sito CodePlex, è possibile trovare il codice qui (guarda in fondo a quel filo e hanno fatto un metodo di estensione molto utile ...)

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

e la si può usare il codice come questo:

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

CanResolve è che metodo di estensione. In realtà sto registrando che l'estensione al momento della creazione del contenitore ... qualcosa di simile:

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

Sembra che manchi questa funzionalità. This article mostra l'esempio di allegare il metodo Resolve nel blocco try/catch per implementarlo.

public object TryResolve(Type type) 
{ 
    object resolved; 

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

    return resolved; 
} 
+0

Grazie per l'ottima risposta. Non ero sicuro se la mia domanda fosse chiara ma la tua risposta è esattamente ciò che stavo cercando. – Vadim

1

Questo non è disponibile nella versione corrente. Tuttavia, puoi sempre "eseguire il rollover" usando i metodi di estensione in C# 3. Una volta che Unity supporta questo, puoi omettere o aggiornare il metodo di estensione.

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

Funzionale ma costoso. L'eccezione di cattura e il rinvio di null non sono una buona pratica. –

14

Si noti inoltre che, se si sta utilizzando Unity 2.0 è possibile utilizzare il nuovo metodo IsRegistered() ed è generic version pure.

+8

Un [grande avvertimento] (https://unity.codeplex.com/discussions/392550) sul metodo IsRegistered: è pensato solo per il debug perché è notoriamente lento! Ha una caratteristica di prestazione di O (n) e può annegare completamente le prestazioni della tua applicazione. – Steven