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

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:

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

Repo:

 public class OrderIntegrationRepository : IOrderIntegrationRepository
    {
        public readonly OrderIntegrationContext _context;

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

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

   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:

 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ę.

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.
2

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

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.

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1