Есть ли TryResolve в Unity?
Как я могу заставить Unity не бросать ResolutionFailedException
, если Resolve
терпит неудачу?
Есть ли что-то вроде TryResolve<IMyInterface>
?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Ответы
Ответ 1
Это была проблема на сайте 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);
}
Ответ 2
Также обратите внимание, что если вы используете Unity 2.0, вы можете использовать новый IsRegistered() и общая версия.
Ответ 3
Кажется, что этой функции не хватает. В этой статье показан пример применения метода Resolve в блоке try/catch для его реализации.
public object TryResolve(Type type)
{
object resolved;
try
{
resolved = Resolve(type);
}
catch
{
resolved = null;
}
return resolved;
}
Ответ 4
Это не доступно в текущей версии. Тем не менее, вы всегда можете "сворачивать свои собственные" с помощью методов расширения на С# 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;
}
}
}
Ответ 5
В Prism Unity 5 они придумали функцию TryResolve, которая была включена в пространство имен Microsoft.Practices.Prism.UnityExtensions.
Пожалуйста, перейдите по этой ссылке https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx для справки.