3

Использование StructureMap, скажем настроить несколько экземпляров для данного интерфейса, которые были определены имена:несколько экземпляров одного и того же типа

registry.For(interfaceType).Add(firstType).Named(firstName); 
registry.For(interfaceType).Add(secondType).Named(secondName); 
registry.For(interfaceType).Use(defaultType); 

Это хорошо работает для моих потребностей. Однако в некоторых сценариях приложения у меня есть причина переопределить экземпляр, чтобы использовать тот же конкретный тип, что и другой экземпляр. Так эффективно происходит что-то вроде этого:

registry.For(interfaceType).Add(defaultType).Named(firstName); 
registry.For(interfaceType).Add(defaultType).Named(secondName); 
registry.For(interfaceType).Use(defaultType); 

На практике, однако, казалось бы, что StructureMap затем использует не только тот же тип, но один и тот же экземпляр. Таким образом, есть точно один экземпляр defaultType в памяти, который контейнер поставляет для любого именованного запроса.

Есть ли способ рассказать об этом, чтобы построить и использовать отдельные экземпляры, даже если они являются одним и тем же конкретным типом?

+2

Если я правильно понял [это] (http://blog.ploeh.dk/2010/07/20/StructureMapPerRequestvs.Uniquelifetimes/), причина в том, что по умолчанию жизненный цикл 'PerRequest', вы бы нужно указать, чтобы жизненный цикл был уникальным, выполнив что-то вроде 'registry.For (interfaceType) .Add (defaultType) .Named (firstName) .LifecycleIs (новый UniquePerRequestLifecycle());' –

+0

@TI: похоже, что это идет к другой крайности спектра, поставляя новый экземпляр по каждому запросу. То, что я ищу, - это где-то посередине, какой-то уникальный жизненный цикл имени-на-экземпляр. Я еще не нахожу ничего подобного, но ты определенно указал мне в хорошем направлении. Возможно, я могу запустить собственный «ILifecycle» или, в крайнем случае, внутренне отслеживать экземпляры в моей реализации локатора сервисов, которая находится между StructureMap и остальной частью кода. – David

ответ

0

Это не поведение, я вижу:

ObjectFactory.Configure(cfg => 
{ 
    cfg.For<IFoo>().Add<Foo>().Named("Foo1"); 
    cfg.For<IFoo>().Add<Bar>().Named("Foo2"); 
    cfg.For<IFoo>().Use<Foo>(); 
}); 

var foo1 = ObjectFactory.GetNamedInstance<IFoo>("Foo1"); 
var defaultFoo = ObjectFactory.GetInstance<IFoo>(); 

Debug.Assert(!Object.ReferenceEquals(foo1, defaultFoo)); 

Здесь именованный экземпляр и экземпляры по умолчанию являются другого.

Вы передаете тип, а не объект (который будет рассматриваться как singleton) в вашей регистрации StructureMap?

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