#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
withDbContextOptionsBuilder<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