Dobrym artykułem, aby dowiedzieć się o zakresie sterowania Autofac i cyklu życia, zakres cyklu życia jest równoważny jednostce pracy w Twojej aplikacji, jednostka pracy zaczyna zakres cyklu życia od początku, a usługi wymagające tej jednostki pracy są oddzielane od zakresu cyklu życia.
Zakresy żywotne
Tworzenie teleskopów Lifetme
Ręcznie stwórz teleskop i Utylizuj. Celowniki są jednorazowe i śledzą utylizację komponentów, więc zawsze wywołuj "Dispose()" lub opakuj je w instrukcje "użyciem".
Zakres życia wytwórni
Czasami możesz potrzebować współdzielenia niektórych usług w ramach jednostki pracy, ale nie chcesz korzystać z globalnych wygód współdzielenia, takich jak tryb singleton. Na przykład cykl życia aplikacji webowej na każde żądanie, w takim przypadku możesz użyć InstancePerMatchingLifetimeScope do określenia cyklu życia i usługi.
Na przykład istnieje komponent wysyłający pocztę i logika transakcji musi wysyłać wiadomości wielokrotnie, aby usługa poczta mogła być współdzielona w każdym logicznym fragmencie transakcji. Jeśli nie chcesz, aby komponent e-mail był globalnym singletonem, możesz ustawić go następująco.
Dodawanie rejestracji do zakresu dożywotniego
Autofac pozwala dodawać "na bieżąco" podczas tworzenia cyklu życia. To może pomóc, gdy potrzebujesz zrobić coś w rodzaju "punktowego spawania" – ograniczonego obejmowania rejestracji lub jeśli potrzebujesz po prostu dodatkowych elementów w lunecie, których nie chcesz rejestrować globalnie. Robisz to, przekazując lambda do BeginLifetimeScope(), który przyjmuje ContainerBuilder i dodaje rejestracje. (Podczas tworzenia cyklu życia rejestruj dodatkowe usługi bez rejestracji globalnej)
Zakres instancji
Zakres instancji określa, w jaki sposób instancja jest współdzielona między żądaniami. Podczas żądania usługi autofac może zwracać zakres pojedynczej instancji, nową instancję dla każdego zakresu zależności lub pojedynczy zakres w kontekście, na przykład wątek lub żądanie HTTP dla każdego zakresu życia. Dotyczy to zarówno instancji zwróconych z jawnego wywołania Resolve(), jak i instancji utworzonych wewnętrznie przez kontener, aby spełnić zależności innego komponentu.
- Instancja na zależność
- Pojedyncza instancja
- Zakres instancji na całe życie
- Zakres życia instancji na dopasowanie
- Instancja na każde żądanie
- Instancja na posiadane
- Zakres wątków
Instancja na zależność
Nazywany także transient' lub 'factory' w innych kontenerach, zwraca unikalną instancję za każdym razem, gdy żądana jest usługa. Jeśli nie ma określonego cyklu życia, jest to domyślne zachowanie.
Każda zależność Resolve zwraca nowy komponent.
Pojedyncza instancja
Ta sama instancja jest zwracana we wszystkich żądaniach i zagnieżdżonych zakresach.
Zakres instancji na całe życie
Ten zakres można zastosować do zagnieżdżonych zakresów. Komponent zakresu na życie ma maksymalnie jedną instancję w zagnieżdżonym zakresie. Jest to przydatne dla obiektów specyficznych dla jednej jednostki pracy, które mogą wymagać zagnieżdżenia dodatkowych jednostek logicznych pracy. Każdy zagnieżdżony zakres dożywotni otrzyma nową instancję zarejestrowanej zależności.
Gdy analizujesz komponent instancji na czas życia, w każdym zagnieżdżonym zakresie jest tylko jedna instancja (np. na jednostkę pracy).
Zakres życia instancji na dopasowanie
Jest to podobne do zakresu instancji na całe życie, ale kontrola może być współdzielona z bardziej precyzyjnymi instancjami. Gdy tworzysz zagnieżdżony cykl życia, możesz go oznaczyć lub nadać mu nazwę. Komponent z zakresem na dopasowywanie w czasie życia będzie miał co najwyżej jedną instancję na zagnieżdżony zakres życia odpowiadającą nazwie. Pozwala to na tworzenie singletonów o ograniczonym zakresie, gdzie zagnieżdżone cykle mogą dzielić komponenty bez tworzenia globalnych instancji.
Przydatne dla pojedynczych jednostek pracy, takich jak żądania http, tworzone jako zagnieżdżone cykle życia. Jeśli zagnieżdżony czas życia jest tworzony dla każdego zapytania HTTP, to każdy komponent o zakresie rzeczywistym będzie miał instancję na każde żądanie HTTP. (Więcej o dożywotnim zakresie na każde życzenie poniżej.)
W większości zastosowań do reprezentacji jednostki pracy potrzebne jest tylko jedno hierarchiczne zagnieżdżanie kontenerów. Jeśli wymagane jest wiele zagnieżdżonych poziomów (np. globalna >żądanie->transakcja), można tworzyć komponenty do udostępniania na określonym poziomie za pomocą tagów.
Gdy rozpoczynany jest zagnieżdżony cykl życia, tagi są powiązane z tym cyklem. Otrzymasz wyjątek, jeśli spróbujesz rozwiązać komponent dotyczący dopasowania w czasie życia, gdy nie ma poprawnie nazwanego zakresu życia. (Jeśli cykl życia niezapisanego tagu zostanie parsowany, wystąpi wyjątek.)
Instancja na każde żądanie
Niektóre typy aplikacji naturalnie mają semantykę typu "żądanie", jak ASP.NET MVC. Wśród tych typów aplikacji pomocne jest posiadanie jakiejś formy "pojedynczego na każde żądanie". Instancja na każde żądanie buduje się na poziomie instancji według dopasowanego zakresu życia poprzez zapewnienie dobrze znanego tagu zakresu na czas życia, metody wygody rejestracji oraz integracji z powszechnymi aplikacjami Typy (jedna instancja na każde żądanie jest budowana na podstawie dopasowanego zakresu życia poprzez zapewnienie dobrze znanego tagu żywotności, metody wygody rejestracji oraz integracji typów aplikacji). W zasadzie chodzi o zakres życia dopasowania.
Oznacza to, że jeśli nie ma aktualnego żądania, a komponent jest zarejestrowany na podstawie instancji na żądanie, zostanie wyrzucony wyjątek. Jest tam szczegółowe FAQ opisujące, jak pracować z okresami życia na każde żądanie.
Logowanie do linku jest widoczne.
Instancja na posiadane
Własny typ relacji ukrytej, tworzący nowy, zagnieżdżony cykl życia. Zależności można ograniczyć do instancji hosta poprzez rejestrację jako instancja na własność.
W tym przykładzie usługa ServiceForHandler będzie dostosowana do okresu życia należącej instancji MessageHandler.
Zakres wątków
Możesz się do niego odnieść
Logowanie do linku jest widoczne.
Rzeczywista walka
Używam trybu Scope Instance Per Lifetime.
W Winform, gdy połączenie jest wykonywane, za każdym razem korzysta z kontekstu bazy danych, jak pokazano na poniższym rysunku:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 W przypadku wielowątkowego i współbieżności, jeśli używasz tego samego kontekstu bazy danych, napotkasz wyjątki podczas dodawania, usuwania, modyfikowania lub sprawdzania bazy danych.
Chcę, aby autofac zwracał nowy obiekt za każdym razem, gdy kliknę przycisk, a kod wygląda następująco:
Jak pokazano poniżej:
(Koniec) |