Как правильно делиться экземплярами зависимостей в Autofac?

У меня есть три класса, скажем, A, B и C, так что:

  • A зависит от экземпляров B и C;
  • B зависит от экземпляра C;
  • И A, и B должны совместно использовать экземпляр C.

Как я могу настроить контейнер, чтобы все было правильно подключено с помощью одного вызова Resolve<A>()?

Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Лучшие практики использования Guice в ваших Java-проектах
Лучшие практики использования Guice в ваших Java-проектах
Guice от Google - это популярная система инъекции зависимостей для Java-приложений. Он помогает разработчикам создавать более ремонтопригодный,...
0
0
316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот для чего нужны пожизненные прицелы. Если вы регистрируете что-то как отдельный экземпляр, он живет в корневой области действия, и все его разделяют. Если вы зарегистрируетесь в качестве экземпляра для области жизненного цикла, все, разрешенное в одной и той же области, будет использовать один и тот же экземпляр. Тонны и тонны документов по этой теме, включая примеры.

Можно, конечно, и посложнее. Вы можете зарегистрировать лямбду с общими экземплярами, которые вы создаете вручную; вы можете использовать Owned<T>, чтобы создать крошечную область действия для отдельного компонента... Опять же, тонны документов. Я бы порекомендовал провести несколько экспериментов самостоятельно, чтобы получить хорошие практические знания.

Как вы управляете областями, зависит от вас. Вы можете почерпнуть некоторые идеи из этого документа по обработке областей времени жизни для каждого запроса. В пользовательском приложении с индивидуальными требованиями, очевидно, не может быть "предписывающего руководства". Некоторые люди заключают единицы работы в масштабы жизни. Некоторые люди оставляют это на усмотрение пакетов интеграции и используют только предоставленную область действия на уровне запроса.

  • Если вы создаете пожизненную область, вам решать, как ее очистить. Autofac не сделает это за вас.
  • Если пакет интеграции создает область (например, интеграция веб-приложения создает область для каждого запроса), этот пакет очистит ее. Если вы сделаете это, вы можете столкнуться с проблемами, если выбросите прицел слишком рано.

Ага, я видел такие. Собственно, чего я не мог из них понять, так это: как мне теперь управлять самими скоупами? Сохраню ли я их в своих объектах? Как-то неловко...

vines 21.05.2019 17:25

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

Travis Illig 21.05.2019 18:12

Другие вопросы по теме