ResolutionFailedException
如果失败,我怎样才能让 Unity 不抛出Resolve
?
有没有类似的东西TryResolve<IMyInterface>
?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
ResolutionFailedException
如果失败,我怎样才能让 Unity 不抛出Resolve
?
有没有类似的东西TryResolve<IMyInterface>
?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
另请注意,如果您使用的是Unity 2.0,您可以使用新的IsRegistered()方法,它也是通用版本。
这是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);
}
它似乎缺少此功能。本文展示了在 try/catch 块中包含 Resolve 方法来实现它的示例。
public object TryResolve(Type type)
{
object resolved;
try
{
resolved = Resolve(type);
}
catch
{
resolved = null;
}
return resolved;
}
这在当前版本中不可用。但是,您始终可以使用 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;
}
}
}
在 Prism Unity 5 中,他们提出了TryResolve函数,该函数已包含在命名空间Microsoft.Practices.Prism.UnityExtensions中。
请通过此链接https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx进行参考。
IComponent component= null;
if (c.IsRegistered<IComponent>(registrationName))
{
component= c.Resolve<IComponent>(registrationName);
}
return component;