在Unity中有TryResolve吗?

时间:2009-05-18 17:55:53

标签: c# unity-container ioc-container

如果ResolutionFailedException失败,如何让Unity不要抛出Resolve

有类似TryResolve<IMyInterface>的内容吗?

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

6 个答案:

答案 0 :(得分:15)

另请注意,如果您使用的是Unity 2.0,则可以使用新的IsRegistered()方法,也可以使用generic version

答案 1 :(得分:9)

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

答案 2 :(得分:3)

似乎缺少此功能。 This article显示了在try / catch块中包含Resolve方法以实现它的示例。

public object TryResolve(Type type)
{
    object resolved;

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

    return resolved;
}

答案 3 :(得分:1)

目前的版本不提供此功能。但是,您始终可以使用C#3中的扩展方法“自己动手”。一旦Unity支持,您可以省略或更新扩展方法。

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

答案 4 :(得分:0)

在Prism Unity 5中,他们提出了 TryResolve 功能,该功能已包含在命名空间 Microsoft.Practices.Prism.UnityExtensions 中。

请浏览此https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx链接以供参考。

答案 5 :(得分:0)

IComponent component= null;

if (c.IsRegistered<IComponent>(registrationName))
{
  component= c.Resolve<IComponent>(registrationName);
}

return component;