/ / Autofac: Jaka jest różnica między InstancePerRequest i InstancePerLifetimeScope w aplikacji MVC - asp.net-mvc, wycieki pamięci, wstrzykiwanie zależności, autofac, ioc-container

Autofac: Jaka jest różnica między InstancePerRequest i InstancePerLifetimeScope w aplikacji MVC - asp.net-mvc, wycieki pamięci, iniekcja zależności, autofac, ioc-container

Próbuję zrozumieć zakresy życia w Autofac IOC i mam następujące pytanie.

Załóżmy, że mamy klasę:

public class TestMemLeak
{
SomeDisposableContext cn;
public TestMemLeak(SomeDisposableContext context)
{
cn = context;
}
}

gdzie wstrzyknięta zależność SomeDisposableContext implementuje IDisposable.

W aplikacji MVC pojawia się przeciek pamięci, gdyrozwiązywanie obiektu TestMemLeak, jeśli SomeDisposableContext jest zarejestrowany jako InstancePerDependency (opcja domyślna). Wyciek zniknął, jeśli zarejestruję go jako InstancePerRequest lub InstancePerLifetimeScope.

Nie rozumiem, dlaczego InstancePerLifetimeScopenaprawia wyciek. Rozumiem, że jeśli rozwiążemy zależność od roota, to InstancePerLifetimeScope powinien zachowywać się w taki sam sposób jak InstancePerDependency, a rozwiązaniem problemu byłoby przekazanie ILifetimeScope do klasy TestMemLeak i rozwiązanie zależności za pomocą zasięgu życia. Dlaczego to założenie jest błędne i jaka jest różnica między scenariuszem InstancePerRequest i InstancePerLifetimeScope w scenariuszu aplikacji MVC (oprócz InstancePerRequest szuka określonego zakresu czasu życia „httpRequest”)? Kiedy należy używać InstancePerRequest? Byłoby wspaniale, gdyby ktoś mógł to wyjaśnić, zwłaszcza z perspektywy przecieków pamięci.

Odpowiedzi:

2 dla odpowiedzi № 1

Jak opisano w dokumentacja, InstancePerLifetimeScope działa na zagnieżdżonych rozwiązaniach. Oznacza to, że w twoim przypadku jeden obiekt został utworzony dla twojego żądania HTTP i otrzymuje wstrzyknięte zależności i wszystkie są rozwiązywane w tym samym zakresie. Jest to zasadniczo realizowane przez integrację Autofac MVC, jest to znane jako BeginLifetimeScope z tagiem zakresu HTTP.

W przypadku, gdy twoja zależność zostanie utworzona gdzie indziej, a nie w zagnieżdżonej rozdzielczości trzy, będzie poza zakresem życia i nie zostanie usunięta.

InstancePerRequest jest jednak niczym więcej InstancePerMatchingLifetimeScope ze wstępnie zdefiniowaną stałą tagu MatchingScopeLifetimeTags.RequestLifetimeScopeTag. Dlatego twoja zależność nie musi byćwystąpi wewnątrz zagnieżdżonej rozdzielczości zakresu czasu życia, wystarczy, że zakres z tym znacznikiem będzie otwarty, aby dołączyć instancję do tego zakresu.