Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 24701|Відповідь: 1

[Джерело] Autofac контролює обсяг і термін служби

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

Терміни служби

Створюйте телескопи Lifetme

Створіть приціл вручну і Утилізуйте. Lifetime scope є одноразовим і відстежує утилізацію компонентів, тому обов'язково дзвоните "Dispose()" або обгортайте їх у "використовуючи" оператори.




Терміни служби використання лейблів

Іноді потрібно ділити деякі послуги в межах одиниці роботи, але не варто використовувати глобальні зручності спільного використання, такі як режим singleton. Наприклад, життєвий цикл веб-додатка на запит, у такому випадку ви можете використати InstancePerMatchingLifetimeScope для ідентифікації свого життєвого циклу та сервісу.

Наприклад, є компонент, який надсилає пошту, і логіка транзакцій повинна надсилати повідомлення кілька разів, тому поштовий сервіс можна розділити в кожному логічному транзакційному слайсі. Якщо ви не хочете, щоб компонент електронної пошти був глобальним синглтоном, можна налаштувати це так.



Додавання реєстрацій до пожиттєвого обсягу

Autofac дозволяє додавати «на ходу» при створенні життєвого циклу. Це може допомогти, коли потрібно зробити щось на кшталт «точкового зварювання» обмеженого реєстраційного перевизначення або якщо вам просто потрібні додаткові дані в масштабі, які ви не хочете реєструвати глобально. Ви робите це, передаючи лямбду до BeginLifetimeScope(), який бере ContainerBuilder і додає реєстрації. (При створенні життєвого циклу реєструйте додаткові сервіси без глобальної реєстрації)



Сфера застосування екземплярів

Обсяг екземпляру визначає, як екземпляр спільно використовується між запитами. Під час запиту на сервіс autofac може повертати область однієї екземплярної області, новий екземпляр для кожної області залежності або одиночний елемент у контексті, наприклад, у потоці чи HTTP-запиті за межі життя. Це стосується екземплярів, повернених з явного виклику Resolve(), а також екземплярів, створених контейнером внутрішньо для задоволення залежностей іншого компонента.

  • Екземпляр за залежністю
  • Одиночний екземпляр
  • Екземпляр за межі життя
  • Обсяг життя екземпляра за відповідність
  • Екземпляр за запитом
  • Екземпляр на власника
  • Обсяг потоку


Екземпляр за залежністю

У інших контейнерах її також називають тимчасовим або «заводським» — вона повертає унікальний екземпляр щоразу, коли запитується сервіс. Якщо життєвий цикл не вказано, це поведінка за замовчуванням.



Кожна залежність Resolve повертає новий компонент.



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

Один і той самий екземпляр повертається для всіх запитів і вкладених областей.




Екземпляр за межі життя

Цей діапазон може застосовуватися до вкладених областей. Компонент масштабу за пожиттєвим циклом має максимум один екземпляр у вкладеній області. Це корисно для об'єктів, специфічних для однієї одиниці роботи, які можуть потребувати вкладення додаткових логічних одиниць роботи. Кожна вкладена область життя отримає новий екземпляр зареєстрованої залежності.



Коли ви розбираєте компонент об'єкта об'єкта за життєвий час, у кожній вкладеній області є лише один екземпляр (наприклад, на одиницю роботи).


Обсяг життя екземпляра за відповідність

Це схоже на Instance Per Lifetime Scope, але керування можна розділити з більш точними екземплярами. Коли ви створюєте вкладений життєвий цикл, ви можете позначити його або дати назву. Компонент із обсягом життя на кожну вкладену життєвість матиме не більше одного екземпляра на вкладений обсяг життя, який відповідає даному імені。 Це дозволяє створювати обмежувані одиночні елементи, де вкладені цикли можуть ділити компоненти без створення глобальних екземплярів.

Корисно для окремих одиниць роботи, таких як http-запити, створені як вкладені життєві цикли. Якщо вкладений життєвий цикл створюється для кожного HTTP-запиту, то будь-який компонент із попереднім обсягом життя матиме екземпляр для кожного HTTP-запиту. (Детальніше про обсяг життя на замовлення нижче.)

У більшості застосунків для представлення одиниці роботи потрібне лише одне ієрархічне вкладення контейнера. Якщо потрібно кілька вкладених рівнів (наприклад, глобальна >request->транзакція), можна створити компоненти для спільного використання на певному рівні через теги.



Коли починається вкладений життєвий цикл, теги асоціюються з цим циклом. Ви отримаєте виняток, якщо намагаєтеся розв'язати компонент з відповідністю життєвого циклу, якщо немає правильно названої області життя. (Якщо життєвий цикл незбереженого тегу буде проаналізовано, виникне виняток.)



Екземпляр за запитом

Деякі типи додатків природно мають семантику типу «запит», наприклад, ASP.NET MVC. Серед таких типів додатків корисно мати певну форму «одиночного тарифу на запит». Інстанція на запит базується на межі відповідного обсягу життя, надаючи відомий тег lifetime scope, метод зручності реєстрації та інтеграцію для загальноприйнятих додатків типи (один екземпляр на запит будується на основі відповідного терміну життя, забезпечуючи відомий тег життя, метод зручності реєстрації та інтеграцію для поширених типів додатків). По суті, це відповідає обсягу відповідного терміну служби.

Це означає, що якщо поточного запиту немає, і ви розбираєте компонент, зареєстрований на основі instance-per-request, буде викинутий виняток. Є детальний розділ поширених запитань, у якому описано, як працювати з термінами служби на запит.

Вхід за гіперпосиланням видно.



Екземпляр на власника

Власник імпліцитного типу стосунків, що створює новий вкладений життєвий цикл. Залежності можна обмежити екземпляром хоста, зареєструвавши в 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