2009-02-24 3 views
2

У меня есть конкретные типы для интерфейсов, сконфигурированных при запуске, но я хочу создать экземпляры конкретного типа во время выполнения с настройкой свойств или установкой разных значений в конструкторе. Все создание экземпляров, которые я вижу, знают о конкретном типе, во время выполнения я не знаю конкретного типа. Есть ли способ создать конкретный экземпляр интерфейса/класса, не зная конкретного типа? Это то, что я видел:Пример создания StructureMap

[Test] 
public void DeepInstanceTest_with_SmartInstance() 
{ 
    assertThingMatches(registry => 
    { 
     registry.ForRequestedType<Thing>().TheDefault.Is.OfConcreteType<Thing>() 
       .WithCtorArg("name").EqualTo("Jeremy") 
       .WithCtorArg("count").EqualTo(4) 
       .WithCtorArg("average").EqualTo(.333); 
     }); 
} 

ИЛИ:

var container = new Container(x => 
{ 
    x.ForConcreteType<SimplePropertyTarget>().Configure 
    .SetProperty(target => 
    { 
     target.Name = "Max"; 
     target.Age = 4; 
    }); 
}); 

Я хочу сделать что-то подобное ... но не знаю, конкретный тип .... только абстрактный класс или интерфейс (в этом случае будут иметь свойства). Однако конкретный тип настроен.

ответ

2

Нашел ответ с руководством Джереми Миллера (автор StructureMap). Вот где он указал мне на:

http://structuremap.sourceforge.net/RetrievingServices.htm#section5

вот пример того, что я использовал:

IDatabaseRepository repo = 
       ObjectFactory.With("server").EqualTo("servername"). 
       With("database").EqualTo("dbName"). 
       With("user").EqualTo("userName"). 
       With("password").EqualTo("password"). 
       GetInstance<IDatabaseRepository>(); 
0

Для создания конкретных экземпляров вам понадобится factory pattern. Момент создания обязательно должен знать, какова конкретная реализация.

+1

вам не нужен шаблон фабрики, потому что StructureMap заботится о том, что для вас. Я нашел ответ, хотя ... спасибо. – CSharpAtl

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