2009-05-18 19 views
13

¿Cómo puedo hacer que Unity no arroje ResolutionFailedException si Resolve falla?¿Hay TryResolve en Unity?

¿Hay algo como TryResolve<IMyInterface>?

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

Respuesta

8

Este ha sido un problema en el sitio CodePlex, se puede encontrar el código aquí (mira al final de ese hilo y han hecho un método de extensión muy útil ...)

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

y la puede utilizar código como este:

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

CanResolve es que el método de extensión. En realidad estoy registrar esa extensión sobre la creación del contenedor ... algo como esto:

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

Parece que carece de esta función. This article muestra el ejemplo de adjuntar el método Resolve en el bloque try/catch para implementarlo.

public object TryResolve(Type type) 
{ 
    object resolved; 

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

    return resolved; 
} 
+0

Gracias por la gran respuesta. No estaba seguro de si mi pregunta era clara, pero tu respuesta es exactamente lo que estaba buscando. – Vadim

1

Esto no está disponible en la versión actual. Sin embargo, siempre puede "lanzar el suyo" utilizando los métodos de extensión en C# 3. Una vez que Unity lo admite, puede omitir o actualizar el método de extensión.

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

Funcional pero costoso. La excepción de captura y la devolución nula no son buenas prácticas. –

14

nota también de que, si estás usando Unity 2.0 puede utilizar el nuevo método IsRegistered() y es generic version también.

+8

Una [advertencia grande] (https://unity.codeplex.com/discussions/392550) sobre el método IsRegistered: solo está destinado a la depuración porque es notoriamente lento. Tiene una característica de rendimiento de O (n) y puede ahogar completamente el rendimiento de su aplicación. – Steven