Autofac, per-scope-lifetime, dwie różne instancje

Autofac, per-scope-lifetime, dwie różne instancje
xeo545x39
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kosmos
  • Postów: 1571
0

Dostaję dwie różne instancje mimo, że mam zarejestrowane jako per-scope-lifetime. Nie rozumiem dlaczego albo jestem ślepy. Lazy<T> chyba nie wpływa na to czy zostanie zresolvovany ze scope czy nie? AuthenticationMiddleware jest jako Lazy, ale nadal scope istnieje gdy jest wykonywany, bo jest w ciele scope'a..

Zarejestrowane mam:

Kopiuj
builder.Register<OrderIntegrationContext>(c => GetDbContext(c)).InstancePerLifetimeScope();
builder.RegisterType<OrderIntegrationRepository>().As<IOrderIntegrationRepository>().InstancePerLifetimeScope();

Repo:

Kopiuj
 public class OrderIntegrationRepository : IOrderIntegrationRepository
    {
        public readonly OrderIntegrationContext _context;

        public OrderIntegrationRepository(OrderIntegrationContext context)
        {
            _context = context;
        }

Inicjalizacja scope'a i pierwsze użycie następuje tutaj:

Kopiuj
   using (var scope = Container.BeginLifetimeScope(builder =>
            {
                Container.Resolve<ISpecificTestDataInitializer>()
                    .EnsureConfiguration()
                    .EnsureOrderForQueryingForValidCustomer(out var order);

// ................................................

  // w srodku ISpecificTestDataInitializer
 internal class SpecificTestDataInitializer : ISpecificTestDataInitializer
    {
        private readonly OrderIntegrationContext context;

        public SpecificTestDataInitializer(OrderIntegrationContext orderIntegrationContext)
        {
            this.context = orderIntegrationContext;
        }

// ... tu sie cos inicjalizuje na this.context

No i teraz w drugim miejscu:

Kopiuj
 public class AuthenticationMiddleware : Middleware<CustomerOrderConfig<IContract>>
    {
        private readonly IOrderIntegrationRepository _repository;

        public AuthenticationMiddleware(IOrderIntegrationRepository repository)
        {
            _repository = repository;

       // ...
      await _repository.GetSingleOrDefaultAsync(... // no i sie wywala bo nie ma nic zainicjalizowanego w kontekście, bo robi zapytanie na innej instancji kontekstu niz inicjalizacja byla zrobiona

Wszystko jest w tym samym scope, więc nie czaję.

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0
  1. Upewnij się, że w momencie rejestrowania OrderIntegrationContext GetDbContext zwraca Ci poprawny obiekt, a nie np. null.
  2. Upewnij się, że w innych miejscach jest ok.
  3. Nie powinieneś kontekstu bazy danych rejestrować jako singleton. To powinny być oddzielne instancje - dla każdego requestu.
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2

Z tego kodu nie wynika, żeby wszystko było w tym samym scope.

xeo545x39
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kosmos
  • Postów: 1571
0

Ok, jednak ślepy uff - resolve robiłem przecież na Container a nie na Scope i jeszcze w dodatku ta operacja nie powinna być przy budowaniu scope'a. Jednak samo to nie pomogło, bo jeszcze musiałem zmienić ISpecificTestDataInitializer na per-scope - do tej pory był singletonem, ale to by wychodziło na to, że Autofac dla singletona tworzy sobie oddzielny scope.

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0

To chyba akurat nic dziwnego, że singletony są poza jakimkolwiek definiowanym przez programistę scopem. :)

xeo545x39
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kosmos
  • Postów: 1571
0

Nie no w sumie racja :) Przez chwilę wyobrażałem sobie, że przecież ten singleton mógłbybyć per scope co daje sumarycznie.... per scope :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.