Unityが失敗したResolutionFailedException
場合にスローしないようにするにはどうすればよいResolve
ですか?
のようなものはありTryResolve<IMyInterface>
ますか?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Unityが失敗したResolutionFailedException
場合にスローしないようにするにはどうすればよい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);
}
この機能が不足しているようです。この記事では、Resolveメソッドをtry/catchブロックで囲んで実装する例を示します。
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 では、名前空間Microsoft.Practices.Prism.UnityExtensionsに含まれているTryResolve関数を考え出しました。
このリンクhttps://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspxを参照してください。