Добра статия за научаване за обхвата и жизнения цикъл на Autofac – обхватът на жизнения цикъл е еквивалентен на единица работа във вашето приложение, единица работа започва обхвата на жизнения цикъл от началото, а след това услугите, които изискват тази единица, се отделят от обхвата на жизнения цикъл.
Обхвати за цял живот
Създаване на Lifetme телескопи
Създай телескоп ръчно и изхвърляй. Целите за цял живот са еднократни и следят изхвърлянето на компоненти, затова винаги се уверявайте, че зовете "Dispose()" или ги обвивате в "използване" оператори.
Обхвати на живота на лейбъла
Понякога може да се наложи да споделяте някои услуги в рамките на единица работа, но не искате да използвате глобални удобства за споделяне, като режим singleton. Например, жизненият цикъл на уеб приложение по заявка, в който случай можете да използвате InstancePerMatchingLifetimeScope, за да идентифицирате жизнения си цикъл и услуга.
Например, има компонент, който изпраща поща, а логиката на транзакцията трябва да изпраща съобщения няколко пъти, така че пощенската услуга може да се споделя във всеки логически транзакционен срез. Ако не искате имейл компонентът да е глобален сингълтон, можете да го настроите по следния начин.
Добавяне на регистрации към доживотен обхват
Autofac ви позволява да добавяте "в движение" при създаване на жизнен цикъл. Това може да ти помогне, когато трябва да направиш нещо като "точкова заварка" ограничена регистрационна проверка или ако просто ти трябват допълнителни неща в обхват, който не искаш да регистрираш глобално. Правиш това, като подадеш lambda към BeginLifetimeScope(), който взема ContainerBuilder и добавя регистрации. (При създаване на жизнен цикъл, регистрирайте допълнителни услуги без глобална регистрация)
Обхват на инстанцията
Обхватът на инстанцията определя как една инстанция се споделя между заявките. При заявка за услуга, autofac може да върне един обхват на инстанция, нов инстанс за всеки обхват на зависимост или единичен обхват в контекст, като нишка или HTTP заявка за всеки обхват на живота. Това се отнася за инстанции, върнати от явно извикване на Resolve(), както и за инстанции, създадени вътрешно от контейнера, за да удовлетворят зависимостите на друг компонент.
- Инстанция за зависимост
- Единична инстанция
- Инстанция за всеки животен обхват
- Обхват на живота на инстанция на съвпадение
- Инстанция на заявка
- Инстанция на собственост
- Обхват на нишките
Инстанция за зависимост
В други контейнери се нарича още временен или "фабричен", като връща уникална екземпляр всеки път, когато се поиска услуга. Ако не е посочен жизнен цикъл, това е поведението по подразбиране.
Всяка зависимост от Resolve връща нов компонент.
Единична инстанция
Една и съща инстанция се връща за всички заявки и вложени области.
Инстанция за всеки животен обхват
Този обхват може да се приложи към вложени обхвати. Компонентът за обхват на живот има максимум един инстанция в вложения обхват. Това е полезно за обекти, специфични за една единица работа, които може да се нуждаят от допълнителни логически единици на работа. Всяка вложена животна област ще получи нов екземпляр на регистрираната зависимост.
Когато парсирате компонента на инстанция на обхвата за всеки животен цикъл, във всеки вложен обхват има само една инстанция (например на единица работа).
Обхват на живота на инстанция на съвпадение
Това е подобно на Instance Per Lifetime Scope, но контролът може да се споделя с по-прецизни инстанции. Когато създавате вложен жизнен цикъл, можете да го етикетирате или да му дадете име. Компонент с обхват на живот на съвпадение на живот ще има най-много една екземплярна област на вложена животна система, която съвпада с дадено име。 Това позволява създаването на обхватни сингълтонове, при които вложените цикли могат да споделят компоненти без да създават глобални инстанции.
Полезно за отделни единици работа, като http заявки, създадени като вложени жизнени цикли. Ако се създаде вложен живот за всяка HTTP заявка, тогава всеки компонент с обхват на живот ще има инстанция за всяка HTTP заявка. (Повече за обхвата на живота на заявка по-долу.)
В повечето приложения е необходимо само едно йерархично вложене на контейнери, за да се представи единица работа. Ако са необходими няколко вложени нива (например global->request->transaction), могат да се създадат компоненти, които да се споделят на определено ниво чрез тагове.
Когато започне вложен жизнен цикъл, таговете се свързват с този жизнен цикъл. Ще получите изключение, ако се опитате да разрешите компонент за съвпадение на живота, когато няма правилно именуван обхват на живота. (Ако жизненият цикъл на незапазения таг бъде анализиран, ще възникне изключение.)
Инстанция на заявка
Някои типове приложения естествено имат семантика тип "заявка", като ASP.NET MVC. Сред тези типове приложения е полезно да има някаква форма на "единичен брой на заявка". Instance per request се надгражда върху instance per matching lifetime scope, като предоставя добре познат tag за обхват на живота, метод за удобство на регистрация и интеграция за общо приложение типове (един екземпляр на заявка се изгражда върху обхвата на живота, който съвпада, като предоставя добре познат таг за живота, метод за удобство на регистрация и интеграция за често срещани типове приложения). По същество това е според съответстващия обхват на живота.
Това означава, че ако няма текуща заявка и парсирате компонент, регистриран на база инстанция на заявка, ще бъде добавено изключение. Има подробен раздел на често задавани въпроси, който описва как да работите с продължителности на живот на заявка.
Входът към хиперлинк е видим.
Инстанция на собственост
Притежаван имплицитен тип връзка, създаващ нов вложен жизнен цикъл. Зависимостите могат да бъдат ограничени до хост инстанцията чрез регистрация с instance-per-owned.
В този пример услугата ServiceForHandler ще бъде ограничена до живота на притежаваната инстанция на MessageHandler.
Обхват на нишките
Можете да се обърнете към него
Входът към хиперлинк е видим.
Действителен бой
Използвам режима Instance Per Lifetime Scope.
В Winform, когато извикването се изпълнява, се използва контекст на база данни всеки път, както е показано на фигурата по-долу:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 В случай на многонишковост и конкурентност, ако използвате един и същ контекст на базата данни, ще срещнете изключения при добавяне, изтриване, модифициране или проверка на базата данни.
Искам autofac да връща нов обект всеки път, когато натисна бутона, кодът е следният:
Както е показано по-долу:
(Край) |