在Unity中有TryResolve吗?

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

有没有类似TryResolve东西?

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

这是codeplex网站上的一个问题,你可以在这里找到代码(查看该主题的底部,他们已经制作了一个扩展方法……非常方便)

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

你可以使用这样的代码:

 if (container.CanResolve() == true) { try { return container.Resolve(); } 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(); section.Containers.Default.Configure(container); } 

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

它似乎缺乏此function。 本文展示了在try / catch块中包含Resolve方法以实现它的示例。

 public object TryResolve(Type type) { object resolved; try { resolved = Resolve(type); } catch { resolved = null; } return resolved; } 

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

 public static class UnityExtensions { public static T TryResolve( this UnityContainer container ) where T : class { try { return (T)container.Resolve( typeof( T ) ); } catch( Exception ) { return null; } } } 

在Prism Unity 5中,他们提出了名称为Microsoft.Practices.Prism.UnityExtensionsTryResolve函数。

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