Resolve
が失敗した場合、Unityをスローしないようにするにはどうすればよいですか?ResolutionFailedException
UnityにTryResolveはありますか?
TryResolve<IMyInterface>
はありますか?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Resolve
が失敗した場合、Unityをスローしないようにするにはどうすればよいですか?ResolutionFailedException
UnityにTryResolveはありますか?
TryResolve<IMyInterface>
はありますか?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
これは、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);
}
この機能が不足しているようです。 This articleは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;
}
}
}
機能的ですが高価です。例外をキャッチしnullを返すことは良い方法ではありません。 –
はまた、あなたがUnity 2.0を使用している場合は、新しいIsRegistered()メソッドを使用することができ、ことに注意し、それは同様にgeneric versionです。プリズムユニティ5では
IsRegisteredメソッドに関する[大きな警告](https://unity.codeplex.com/discussions/392550):それは悪名高いゆっくりとデバッグするためのものです!これはO(n)のパフォーマンス特性を持ち、アプリケーションのパフォーマンスを完全に無くすことができます。 – Steven
、彼らは名前空間Microsoft.Practices.Prism.UnityExtensionsに含まれているTryResolve機能が出ています。
このリンクを参照してくださいhttps://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx参考までに。
偉大な答えをありがとう。私の質問がはっきりしていたのかどうかはわかりませんでしたが、あなたの答えはまさに私が探していたものです。 – Vadim