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

Вид: 24701|Ответ: 1

[Источник] Autofac управляет объёмом и сроком службы

[Скопировать ссылку]
Опубликовано 2020-9-19 12:51:52 | | | |
Хорошая статья для изучения сферы и жизненного цикла управления Autofac: область жизненного цикла эквивалентен единице работы в вашем приложении, единица работы начинает область действия с самого начала, а сервисы, требующие этой единицы работы, отделяются из области жизненного цикла.

Срок службы

Создайте прицелы Lifetme

Создайте прицел вручную и утилизируйте. Пожизненные телескопы одноразовые и отслеживают утилизацию компонентов, поэтому всегда звоните в «Dispose()» или обертывайте их в «использующие» операторы.




Сроки службы лейбла

Иногда может понадобиться делиться некоторыми сервисами внутри единицы работы, но не стоит использовать глобальные удобства совместного использования, такие как режим одиночного использования. Например, жизненный цикл веб-приложения по запросу, в таком случае вы можете использовать InstancePerMatchingLifetimeScope для определения жизненного цикла и сервиса.

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



Добавление регистраций в пожизненный срок действия

Autofac позволяет добавлять «на ходу» при создании жизненного цикла. Это может помочь, когда нужно сделать ограниченное переопределение регистрации «точечной сваркой» или если просто нужны дополнительные задачи в области масштаба, которые вы не хотите регистрировать глобально. Для этого вы передаёте лямбду в BeginLifetimeScope(), который берёт ContainerBuilder и добавляет регистрации. (При создании жизненного цикла регистрируйте дополнительные сервисы без глобальной регистрации)



Область действия экземпляра

Область действия экземпляра определяет, как экземпляр будет разделен между запросами. При запросе сервиса autofac может вернуть область действия одного экземпляра, новый экземпляр на область зависимости или одиночный домен в контексте, например, поток или HTTP-запрос за область жизни. Это применимо к экземплярам, возвращаемым из явного вызова Resolve(), а также к экземплярам, созданным внутри контейнера для удовлетворения зависимостей другого компонента.

  • Экземпляр по зависимости
  • Одиночный экземпляр
  • Экземпляр за пожизненный цикл
  • Продолжительность жизни экземпляра за сопоставление
  • Экземпляр по запросу
  • Экземпляр на владение
  • Объём потока


Экземпляр по зависимости

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



Каждая зависимость Resolve возвращает новый компонент.



Одиночный экземпляр

Один и тот же экземпляр возвращается во всех запросах и вложенных областях.




Экземпляр за пожизненный цикл

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



При парсировании компонента экземпляра за пожизненный срок действия в каждой вложенной области есть только один экземпляр (например, на единицу работы).


Продолжительность жизни экземпляра за сопоставление

Это похоже на Instance Per Lifetime Scope, но управление можно делить с более точными экземплярами. Когда вы создаёте вложенный жизненный цикл, вы можете промаркировать его или дать имя. Компонент с областью действия жизни на каждый вложенный срок жизни будет иметь не более одного экземпляра на вложенный срок жизни, который соответствует заданному имену. Это позволяет создавать обмежённые одиночные, где вложенные циклы могут делить компоненты без создания глобальных экземпляров.

Полезно для отдельных единиц работы, таких как http-запросы, созданные в виде вложенных жизненных циклов. Если для каждого HTTP-запроса создаётся вложенная жизнь, то любой компонент с областью действия на каждый HTTP-запрос будет иметь экземпляр. (Подробнее о продолжительности на каждый запрос ниже.)

В большинстве приложений для представления единицы работы требуется только одно иерархическое вложение контейнеров. Если требуется несколько вложенных уровней (например, глобальная >request->transaction), можно создать компоненты для совместного использования на определённом уровне через теги.



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



Экземпляр по запросу

Некоторые типы приложений естественно имеют семантику типа «запрос», например, ASP.NET MVC. Среди этих типов заявок полезно иметь некую форму «одиночного платежа на запрос». Экземпляр на запрос строится на основе экземпляров каждого совпадающего срока жизни, предоставляя хорошо известный тег lifetime scope, метод удобства регистрации и интеграцию с общим приложением Типы (один экземпляр на запрос строится поверх размера жизненного цикла каждого соответствия, предоставляя известный тег жизни, метод удобства регистрации и интеграцию для распространённых типов приложений). По сути, это зависит от соответствующего срока службы.

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

Вход по гиперссылке виден.



Экземпляр на владение

Принадлежащий неявный тип отношений, создающий новый вложенный жизненный цикл. Зависимости могут быть ограничены экземпляром хоста, регистрировавшись с instance-per-owned.



В этом примере сервис ServiceForHandler будет ограничен на срок жизни принадлежащего экземпляра MessageHandler.



Объём потока

Вы можете обратиться к нему

Вход по гиперссылке виден.

Реальные бои

Я использую режим Instance Per Lifetime Scope.

В Winform при выполнении вызова каждый раз используется контекст базы данных, как показано на рисунке ниже:



_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655
_dbContext.GetHashCode();
13583655

В случае многопоточности и параллелизма, если вы используете один и тот же контекст базы данных, вы столкнётесь с исключениями при добавлении, удалении, модификации или проверке базы данных.

Я хочу, чтобы автофак возвращал новый объект каждый раз, когда я нажимаю кнопку, код такой:


Как показано ниже:



(Конец)




Предыдущий:.NET/C# Водяной знак для тайлирования изображений
Следующий:ASP.NET Запретить доступ к файлам журналов в виде URL
Опубликовано 2022-9-8 09:58:24 |
Именно то, что нам нужно
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com