Как правильно делиться экземплярами зависимостей в Autofac? - PullRequest
0 голосов
/ 16 мая 2019

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

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

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

1 Ответ

3 голосов
/ 17 мая 2019

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

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

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

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