Есть ли TryResolve в Unity? - PullRequest
       12

Есть ли TryResolve в Unity?

14 голосов
/ 18 мая 2009

Как я могу заставить Unity не бросать ResolutionFailedException, если Resolve терпит неудачу?

Есть что-то вроде TryResolve<IMyInterface>?

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

Ответы [ 5 ]

15 голосов
/ 25 августа 2010

Также обратите внимание, что если вы используете Unity 2.0 , вы можете использовать новый метод IsRegistered () , а также универсальная версия .

9 голосов
/ 23 мая 2009

Это было проблемой на сайте 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);        
}
3 голосов
/ 18 мая 2009

Кажется, ему не хватает этой функции. В этой статье приведен пример включения метода Resolve в блок try / catch для его реализации.

public object TryResolve(Type type)
{
    object resolved;

    try
    {
        resolved = Resolve(type);
    }
    catch
    {
        resolved = null;
    }

    return resolved;
}
1 голос
/ 18 мая 2009

Недоступно в текущей версии. Однако вы всегда можете «свернуть свои собственные», используя методы расширения в 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;
        }
    }
}
0 голосов
/ 02 июня 2015

В Prism Unity 5 они предложили функцию TryResolve , которая включена в пространство имен Microsoft.Practices.Prism.UnityExtensions .

Пожалуйста, перейдите по этой ссылке https://msdn.microsoft.com/en-us/library/gg419013(v=pandp.50).aspx для справки.

...