在Unity中有TryResolve吗?

Vad*_*dim 14 c# ioc-container unity-container

ResolutionFailedException如果Resolve失败,怎么能让Unity不扔?

有类似的东西TryResolve<IMyInterface>吗?

var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Run Code Online (Sandbox Code Playgroud)

Bry*_*Ray 15

另请注意,如果您使用的是Unity 2.0,则可以使用新的IsRegistered()方法,它也是通用版本.

  • 关于IsRegistered方法的一个[大警告](https://unity.codeplex.com/discussions/392550):它仅用于调试,因为它非常慢!它具有O(n)的性能特征,可以完全淹没您的应用程序的性能. (8认同)

Joh*_*ino 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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);        
}
Run Code Online (Sandbox Code Playgroud)