Не удается разрешить службу для типа ‘Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`

#asp.net-core #entity-framework-core #identityserver4

#asp.net-core #entity-framework-core #identityserver4

Вопрос:

Когда я внедряю DbContextOptionsBuilder в CustomTicketStore в ASP.NET ядро 3.1. Я получаю сообщение об исключении

Некоторые службы не могут быть сконструированы (ошибка при проверке дескриптора службы ‘ServiceType: Microsoft.AspNetCore.Аутентификация.Файлы cookie.Срок службы ITicketStore: Ограниченный тип реализации: OneIAM.Services.Customsticketstore’: Не удается разрешить службу для типа ‘Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1[OneIAM.Data.ApplicationDbContext]’ при попытке активировать ‘OneIAM.Services.customsticketstore’.)

Ниже приведен код из файла запуска.

         public virtual void ConfigureServices(IServiceCollection services)
        {
          ...

          // Persistent ticket/cookie store to provide durable user sessions
          services.AddScoped<ITicketStore, CustomTicketStore>();
          var optionsBuilder = GetDbContextOptionsBuilder(services);

          services.ConfigureApplicationCookie(options =>
          {
            options.SlidingExpiration = true;
            options.SessionStore = new CustomTicketStore(optionsBuilder);  <=
          });
        }

        private static DbContextOptionsBuilder<ApplicationDbContext> GetDbContextOptionsBuilder(IServiceCollection services)
        {
            using (var scope = services.BuildServiceProvider().CreateScope())
            {
                return scope.ServiceProvider.GetService<DbContextOptionsBuilder<ApplicationDbContext>>();
            }
        }
  

Комментарии:

1. Может быть, вы можете поделиться своим CustomTicketStore .

2. @YiyiYou Я мало что добавил CustomTicketStore . Просто добавляю параметр constructor with DbContextOptionsBuilder<ApplicationDbContext> . Я получаю эту ошибку dotnet run .

3. @YiyiYou Однако вы можете воспользоваться этой ссылкой для CustomTicketStore

Ответ №1:

Во-первых, я тестирую ваш код и обнаруживаю, что он воспроизводит вашу ошибку с помощью services.AddScoped<ITicketStore, CustomTicketStore>(); , и вот мой Customsticketstore:

 public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        .......
    }
  

И я обнаружил, что если я добавлю конструктор без параметров в CustomTicketStore, он будет работать:

 public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        public CustomTicketStore()
        {
        }

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        ........
    }
  

Комментарии:

1. Спасибо @YiyiYou. У меня это работает, services.AddScoped<ITicketStore, CustomTicketStore>(); также не вводя службу, но не получая User (ClaimsPrincipal) после этого средства на домашней странице, поэтому не удается загрузить пользователя.

2. Я имею в виду, что вы можете добавить public CustomTicketStore() { } в CustomTicketStore , вам не нужно удалять services.AddScoped<ITicketStore, CustomTicketStore>();

3. Пробовал оба способа, но не получил 'user' (var user = await _userManager.GetUserAsync(User);) значение null.

4. Вы можете проверить, правильно ли вы сохраняете данные в контексте, и сохранить их в базе данных.

5. Потратив пару часов, я смог решить проблему. Спасибо @YiyiYou