AddSingleton - Создать при запуске приложения - PullRequest
1 голос
/ 06 ноября 2019

Мне нужно создавать синглтоны при запуске приложения. В этом примере я создаю экземпляр IdentityOptions с новыми значениями. Проблема в том, что когда я запускаю приложение и хочу создать нового пользователя, оно не принимает значение 125 (оно продолжает использовать 6, что по умолчанию), а если я изменяю это значение из контроллера (см. Пример)все работает отлично. Я понимаю, что экземпляр создается при первом запросе, но возможно ли его создать при запуске приложения? Потому что моя идея - загрузить эти значения из базы данных.

Startup.cs

public void ConfigureServices(IServiceCollection serviceCollection)
{
    ...
    ...
    ...

    serviceCollection.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddEntityFrameworkStores<DatabaseContext>()
        .AddRoleStore<ApplicationRoleStore>()
        .AddUserStore<ApplicationUserStore>()
        .AddUserManager<ApplicationUserManager>()
        .AddRoleManager<ApplicationRoleManager>()
        .AddSignInManager<ApplicationSignInManager>()
        .AddDefaultTokenProviders();

    ...
    ...
    ...

    serviceCollection.AddSingleton(serviceProvider =>
    {
        //using (var currentContext = serviceProvider.CreateScope().ServiceProvider.GetRequiredService<MyIdentityDatabaseContext>())
        {
            return new IdentityOptions
            {
                Password = new PasswordOptions
                {
                    RequiredLength = 125
                }
            };
        }
    });
}

Пример

public class TestController : BaseController<TestController>
{
    private readonly IOptions<IdentityOptions> _myOptions;

    public TestController(IOptions<IdentityOptions> myOptions)
    {
        _myOptions = myOptions;
    }

    [HttpGet]
    [Route("TestConfigureOptions")]
    public IActionResult TestConfigureOptions()
    {
        // 1 - Before assigning 124, the value it has is 6. WHY?

        _myOptions.Password.RequiredLength = 124;

        // 2 - After assigning the 124 and trying to create a user with an incorrect password length, I am informed that the minimum is 124, that this is correct.

        return Ok();
    }

}

1 Ответ

2 голосов
/ 06 ноября 2019

Потому что это две отдельные регистрации.

AddIdentity добавил бы IdentityOptions через опции, используя services.Configure<IdentityOptions>(...)

, что позволило бы вводить IOptions<IdentityOptions>, как ожидается.

Вторая регистрация

serviceCollection.AddSingleton(serviceProvider => { 

        return new IdentityOptions {
            Password = new PasswordOptions {
                RequiredLength = 125
            }
        };

});

не имеет ничего общего с опциями.

Если вы хотите изменить настройки по умолчанию, обновите конфигурацию.

serviceCollection.Configure<IdentityOptions>(options => {
    options.Password.RequiredLength = 125;
});

Существует также перегрузка при вызовеAddIdentity чтобы сделать это за один раз

serviceCollection.AddIdentity<ApplicationUser, ApplicationRole>(options => {
    options.Password.RequiredLength = 125;
})
...