2009-05-18 5 views
13

Comment est-ce que je peux faire que l'unité ne jette pas ResolutionFailedException si Resolve échoue?Y a-t-il TryResolve dans Unity?

Y a-t-il quelque chose comme TryResolve<IMyInterface>?

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

Répondre

8

Cela a été un problème sur le site CodePlex, vous pouvez trouver le code ici (regardez en bas de ce fil et ils ont une méthode d'extension ... très pratique)

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

et vous pouvez utiliser le code comme ceci:

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

CanResolve est cette méthode d'extension. Je me inscris effectivement cette extension lors de la création du conteneur ... quelque chose comme ceci:

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

Il semble qu'il manque cette fonctionnalité. This article montre l'exemple de la méthode Resolve englobante dans le bloc try/catch pour l'implémenter.

public object TryResolve(Type type) 
{ 
    object resolved; 

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

    return resolved; 
} 
+0

Merci pour la bonne réponse. Je n'étais pas sûr si ma question était claire mais votre réponse est exactement ce que je cherchais. – Vadim

1

Cette version n'est pas disponible dans la version actuelle. Cependant, vous pouvez toujours "lancer le vôtre" en utilisant les méthodes d'extension dans C# 3. Une fois que Unity prend en charge cela, vous pouvez omettre ou mettre à jour la méthode d'extension.

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

Fonctionnel mais cher. Attraper une exception et retourner une valeur nulle n'est pas une bonne pratique. –

14

Notez également que, si vous utilisez Unity 2.0 vous pouvez utiliser la nouvelle méthode IsRegistered() et il est generic version aussi bien.

+8

Un [grand avertissement] (https://unity.codeplex.com/discussions/392550) à propos de la méthode IsRegistered: Il est uniquement destiné au débogage car il est notoirement lent! Il a une caractéristique de performance de O (n) et peut complètement noyer les performances de votre application. – Steven

Questions connexes