У меня есть три класса, скажем, A
, B
и C
, так что:
A
зависит от экземпляров B
и C
;B
зависит от экземпляра C
;A
, и B
должны совместно использовать экземпляр C
.Как я могу настроить контейнер, чтобы все было правильно подключено с помощью одного вызова Resolve<A>()
?
Вот для чего нужны пожизненные прицелы. Если вы регистрируете что-то как отдельный экземпляр, он живет в корневой области действия, и все его разделяют. Если вы зарегистрируетесь в качестве экземпляра для области жизненного цикла, все, разрешенное в одной и той же области, будет использовать один и тот же экземпляр. Тонны и тонны документов по этой теме, включая примеры.
Можно, конечно, и посложнее. Вы можете зарегистрировать лямбду с общими экземплярами, которые вы создаете вручную; вы можете использовать Owned<T>
, чтобы создать крошечную область действия для отдельного компонента... Опять же, тонны документов. Я бы порекомендовал провести несколько экспериментов самостоятельно, чтобы получить хорошие практические знания.
Как вы управляете областями, зависит от вас. Вы можете почерпнуть некоторые идеи из этого документа по обработке областей времени жизни для каждого запроса. В пользовательском приложении с индивидуальными требованиями, очевидно, не может быть "предписывающего руководства". Некоторые люди заключают единицы работы в масштабы жизни. Некоторые люди оставляют это на усмотрение пакетов интеграции и используют только предоставленную область действия на уровне запроса.
Это, вероятно, должно было быть частью вашего вопроса; это начинает переходить в другой вопрос. Я обновил свой ответ, однако ответ на предоставленный вопрос был дан, поэтому, если вам нужна дополнительная помощь, я бы рекомендовал принять это как ответ, а затем создать новый вопрос с более подробной информацией о том, что вы пытаетесь достигать.
Ага, я видел такие. Собственно, чего я не мог из них понять, так это: как мне теперь управлять самими скоупами? Сохраню ли я их в своих объектах? Как-то неловко...