2015-10-20 4 views
0

Я пытаюсь выяснить, как настроить конфигурацию StructureMap3, которая работает в обоих WebAPI и в консольном приложении, например:StructureMap3 HybridHttpOrThreadLocalScoped с не HttpSessionState

For<ISession>().HybridHttpOrThreadLocalScoped().Use(p => p.GetInstance<TestingContainer>().GetSession()); 

Для консольных приложений, которые я хотел бы объект жить до тех пор, пока живет нить, и для веб-сайтов, пока живет http-сеанс.

Это возможно с веб-сайтов MVC, поскольку HybridHttpOrThreadLocalScoped использует HttpSessionState, чтобы определить, следует ли создавать новый экземпляр или повторно использовать существующий экземпляр.

У WebApi нет этого объекта HttpSessionState, и поэтому HybridHttpOrThreadLocalScoped не будет работать.

Если мне не понравилось консольное приложение, то я, вероятно, сконфигурировал бы структуру структуры с Transient() или AlwaysUnique или аналогичным.

Итак, что эквивалентно HybridHttpOrThreadLocalScoped, когда нет экземпляра HttpSessionState.

спасибо.

EDIT

-в переставить вопрос ...

ответ

0

В общем, вы должны способствовать Nested Containers для управления жизненным циклом. Причины этого - это именно то, что вы только что отметили, что в некоторых ситуациях использование ни потоком, ни HTTP, ни гибридной области просто не работает. Я видел, что это вызывает огромные проблемы до того, как люди предполагают, что соединения БД расположены, потому что они находятся в других средах, но в одной среде это не так. Кроме того, объяснитель хорош.

Для этого установите зависимости, которые вы хотите распределить по запросу Transient (по умолчанию), и удалите вложенный контейнер в конце запроса. Я написал об этом рабочем процессе в webapi here. Дополнительно official docs рекомендовать this nuget.

Для консольного приложения вы хотите сделать что-то вроде этого:

//parent Container set up at app start 
public void On_UserAction() 
{ 
    //global container set up at app start, either use ObjectFactory (bad, deprecated and to be removed) or just keep track of it yourself. 
    using(var nestedContainer = GlobalContainer.GetNestedContainer()) 
    { 
     var dependency = nestedContainer.GetInstance<DependencyThatHandlesUserInput>(); 
    } 
} 

и это его, используя блок обрабатывает все распоряжения для вас.

Если у вас есть другие вопросы, пожалуйста, спросите меня, я потратил много времени на такие вещи :).

+0

В какой-то мере я согласен с вашей логикой, но что произойдет, если вы создадите два потока внутри одного и того же вложенного контейнера? Думаю, нам не нужна зависимость между вложенным контейнером и потоком, где мы должны помнить о создании нового вложенного контейнера для каждого нового потока или ...? –