2016-11-03 7 views
0

Это, скорее всего, вопрос о нобе.Autofac - охватывает ли область видимости в течение всего времени использования, если она существует?

Предположим, мне нужно решить какой-то интерфейс, скажем, IFunctional в обработке веб-запросов, который зарегистрирован как экземпляр на всю продолжительность жизни в конфигурации autofac. Но прежде чем я это сделаю, я уже решил IService, который зарегистрирован как единственный экземпляр, а также имеет зависимость от IFunctional. Поэтому IService уже разрешен в корневой области, а функция IFunctional уже разрешена в корневой области. Теперь пытается решить IFunctional, скажем, обработки запроса веб, будет это:

  1. создать новый экземпляр IFunctional в «веб-область запроса»
  2. ищет экземпляр IFunctional в дереве областей и найти один в корне области и использовать его?

Для меня первый вариант имеет больше смысла, но я бы предпочел убедиться. Благодаря!

ответ

0

В вашей заявке: IService (singleton) имеет функциональность (на всю жизнь). Таким образом, этот объект IFunctional будет работать с IService. Но другие классы не будут использовать этот функционал. Вкратце: этот функционал будет использоваться IService.

При запуске запроса запускается также срок действия нового запроса. Поэтому, когда вы пытались разрешить/получить объект IFunctional в этой области, он проверяет, Есть ли какой-либо объект IFunctional в моей области?. Если этого не происходит, он создает новый. В противном случае он использует IFunctional, который находится в этой области, а не в других областях даже в корневом (потому что функция не является одиночной).

Таким образом, Первый вариант будет иметь место.

+0

Спасибо за быстрый ответ! Это разрушает мои неуверенности :) – JackMag

+0

Я не предлагаю вам использовать за всю жизнь в одиночных играх. Это может нарушить ваш дизайн. Кроме того, это может быть очень опасно, если они одноразовые. Потому что _per lifetime_ в слове, которое вы ожидаете, начинается и заканчивается. Используйте фабрики или следуйте за SRP. Может быть, IService не нуждается в IFunctional, возможно, это просто нужны некоторые части, которые могут быть одноточечными или зависимыми. –

+0

Не совсем получить эту часть. Вы указываете, что использование зависимости на всю жизнь в объекте с одним экземпляром может быть опасным, потому что каждый объект жизни будет жить до тех пор, пока один экземпляр? И если есть связанный ресурс, он будет удерживаться на всю жизнь программы? Предположим, что служба logging (singleton) нуждается в транзакционном обслуживании (за время жизни) для записи в БД. Кажется, это не опасно для меня. Если вы выполняете много протоколирования, это может быть неэффективно идти на зависимый путь. Похоже, что и с точки зрения SRP, так как я считаю, что SRP относится к классам, а не к экземплярам. – JackMag

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

  • Нет связанных вопросов^_^