17 Stimmen

Gibt es TryResolve in Unity?

Wie kann ich Unity dazu bringen, nicht zu werfen ResolutionFailedException wenn Resolve versagt?

Gibt es etwas wie TryResolve<IMyInterface> ?

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

16voto

Bryan Ray Punkte 912

Beachten Sie auch, dass Sie bei der Verwendung von Einheit 2.0 können Sie die neue IsRegistered() Methode und ihre generische Version auch.

10voto

Johan Leino Punkte 3445

Dies war ein Problem auf der Codeplex-Website, finden Sie den Code hier (siehe am Ende dieses Threads und sie haben eine Erweiterung Methode gemacht ... sehr praktisch)

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

und dann können Sie einen Code wie diesen verwenden:

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

CanResolve ist diese Erweiterungsmethode. Ich registriere diese Erweiterung bei der Erstellung des Containers...etwa so:

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);        
}

3voto

bbmud Punkte 2658

Es scheint, dass diese Funktion nicht vorhanden ist. Dieser Artikel zeigt das Beispiel für das Einschließen der Methode Resolve in den try/catch-Block, um sie zu implementieren.

public object TryResolve(Type type)
{
    object resolved;

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

    return resolved;
}

2voto

LBushkin Punkte 124894

Dies ist in der aktuellen Version nicht möglich. Sie können jedoch jederzeit mit Hilfe von Erweiterungsmethoden in C# 3 "eigene Wege gehen". Sobald Unity dies unterstützt, können Sie die Erweiterungsmethode weglassen oder aktualisieren.

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;
        }
    }
}

0voto

karthik Punkte 16876

In Prism Unity 5 haben sie die folgende Funktion entwickelt TryResolve Funktion, die in den Namespace aufgenommen wurde Microsoft.Practices.Prism.UnityExtensions .

Bitte klicken Sie auf diesen Link https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx als Referenz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X