DI Регистрация типа сервиса .net core 3.0 - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть одноуровневое многоуровневое приложение, и в модуле инфраструктуры, где я пытаюсь разработать отправку электронной почты для подтверждения пользователя, я получаю сообщение об ошибке.

Нет службы для типа 'IMS.Infrastructure.Helpers.CustomEmailConfirmationTokenProvider`1 [Microsoft.AspNetCore.Identity.IdentityUser] 'зарегистрирован.

Из кода, который я сделал, следующий:

public class CustomEmailConfirmationTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
{
    public CustomEmailConfirmationTokenProvider(IDataProtectionProvider dataProtectionProvider, IOptions<DataProtectionTokenProviderOptions> options, ILogger<DataProtectorTokenProvider<TUser>> logger) : base(dataProtectionProvider, options)
    {
    }
}

и для создания сервисов:

services.AddDbContext<ApplicationIdentityDbContext>(options =>
                options.UseSqlServer(configuration.GetConnectionString("Default")));

            services.AddIdentityCore<ApplicationUser>(options =>
                {
                    options.Password.RequireDigit = false;
                    options.Password.RequireLowercase = false;
                    options.Password.RequireNonAlphanumeric = false;
                    options.Password.RequireUppercase = false;
                    options.Password.RequiredLength = 4;

                    options.SignIn.RequireConfirmedEmail = true;
                    options.Tokens.ProviderMap.Add("CustomEmailConfirmation",
                        new TokenProviderDescriptor(
                            typeof(CustomEmailConfirmationTokenProvider<IdentityUser>)));

                    options.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";

                })
                .AddEntityFrameworkStores<ApplicationIdentityDbContext>();



            services.AddTransient<CustomEmailConfirmationTokenProvider<ApplicationUser>>(o =>
            {
                var service = new CustomEmailConfirmationTokenProvider<ApplicationUser>(o.GetService<IDataProtectionProvider>(), o.GetService<IOptions<DataProtectionTokenProviderOptions>>(), o.GetService<ILogger<DataProtectorTokenProvider<ApplicationUser>>>());

                return service;
            });

Мне понадобится помощь, чтобы понять, как сервис CustomEmailConfirmationTokenProvider не зарегистрирован, что я сделал не так?

С уважением, Даниэль

1 Ответ

0 голосов
/ 21 ноября 2019

С точки зрения контейнера IoC CustomEmailConfirmationTokenProvider<ApplicationUser> и CustomEmailConfirmationTokenProvider<IdentityUser> - это два разных и не связанных между собой класса.

Вы должны иметь как использование, так и регистрацию, чтобы иметь одного и того же типа пользователя.

...