2013-09-13 3 views
0

Есть ли способ, чтобы инициализировать StructureMap таким образом, чтобы мы не получили бы этот текст исключения:Экземпляр по умолчанию для именованного экземпляра пропустить

Не удалось найти имя экземпляра «X» для PluginType ISomeInterface.

... но вместо этого получил стандартную реализацию типа?

Пример кода ниже:

[Test] 
public void OnNamedMiss() 
{ 
    ObjectFactory.Initialize(i => 
    { 
     i.For<IX>().Use<Alpha>().Named("alpha"); 
     i.For<IX>().Use<Bravo>().Named("bravo"); 
     i.For<IX>().Use<Charlie>().Named("charlie"); 

     // define default? 
    }); 

    // Can I make this return Default instead of throwing? 
    var x = ObjectFactory.GetNamedInstance<IX>("delta"); 
} 

public interface IX { } 
public class Default : IX { } 
public class Alpha : IX { } 
public class Bravo : IX { } 
public class Charlie : IX { } 

ответ

1

Использование

var x = ObjectFactory.TryGetInstance<IX>("delta") ?? ObjectFactory.GetInstance<IX>(); 

при условии, что вы зарегистрировали Default класс как экземпляр по умолчанию. Метод Use регистрирует экземпляры по умолчанию, а метод Add добавляет дополнительные экземпляры.

i.For<IX>().Use<Default>(); 
i.For<IX>().Add<Alpha>().Named("alpha"); 
i.For<IX>().Add<Bravo>().Named("bravo"); 
i.For<IX>().Add<Charlie>().Named("charlie"); 
+0

Я перечитал вопрос и понял, что вы хотите, чтобы класс по умолчанию был по умолчанию, а не экземпляр C# по умолчанию. Отредактировано в новом решении для этого. – PHeiberg

Смежные вопросы