Разрешение не выполнено из-за ошибки: для типа IHttpContextAccessor нет общедоступного конструктора

Недавно я обновил свое приложение до .net core 6, и теперь я получаю эту ошибку при попытке получить услугу, используя этот код:

IUnityContainer container = HangfireUnityConfig.GetConfiguredContainer();
var authService = container.Resolve<IAuthService>();

Я читал некоторые другие сообщения, в которых упоминалось о добавлении HttpContextAccessor в мой метод ConfigureServices(), но ни один из способов, которые я пробовал, не исправил ошибку.

services.AddHttpContextAccessor();
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Другой человек упомянул о добавлении строки в мой Program.cs, но по-прежнему получает сообщение об ошибке.

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Если я добавлю RegisterType<IHttpContextAccessor, HttpContextAccessor>() в RegisterTypes() в моем классе HangFireUnityConfig, ошибка исчезнет, ​​но позже выдаст новую ошибку, поэтому я не уверен, что это правильное исправление.

public static void RegisterTypes(IUnityContainer container)
{
            // register hangfire dependencies
            container.RegisterType<IHttpContextAccessor, HttpContextAccessor>()
}

AuthService.cs

using MyApp.Entities.DTOs;

namespace MyApp.Service.Auth
{
    public class AuthService : IAuthService
    {
        private UserDto currentUser = null;
        private readonly IHttpContextAccessor _context;
        public AuthService(IHttpContextAccessor ctx)
        {
            _context = ctx;
            currentUser = parseClaimsUser();
        }

        public bool isInRole(string role, List<string> roleList)
        {
            return true;
        }
        public UserDto parseClaimsUser()
        {
            ClaimsPrincipal currentClaim = _context.HttpContext.User;
            UserDto parsedUser = new UserDto();
            bool isAdmin = false;

            if (currentClaim == null || !currentClaim.Identity.IsAuthenticated)
            {
                return parsedUser;
            }
            //return user id from token properties
            parsedUser.userID = currentClaim.Claims.Where(claim => claim.Type == ClaimTypes.NameIdentifier).Select(v => v.Value).FirstOrDefault<string>();
            // retrieve groups from token properties --- this is only retrieved upon login. Users will have to log out and log back in to see any changes in groups
            var currentGroupsIDs = currentClaim.HasClaim(claim => claim.Type == ClaimTypes.Role) ?
                                                     currentClaim.Claims.Where(t => t.Type == ClaimTypes.Role).Select(y => int.Parse(y.Value)).ToList<int>()
                                                     : new List<int>();                                    

            var adminString = currentClaim.Claims.Where(claim => claim.Type == ClaimTypes.AuthorizationDecision)
                .Select(v => v.Value)
                .SingleOrDefault<string>();

            adminString = adminString == null ? "False" : adminString;

            isAdmin = bool.Parse(adminString);

            //parsedUser.userGrp = currentGroups;
            parsedUser.userGrpIDs = currentGroupsIDs;
            parsedUser.isAuthenticated = currentClaim.Identity.IsAuthenticated;
            parsedUser.displayName = currentClaim.Identity.Name;
            parsedUser.email = currentClaim.Claims.Where(w => w.Type == ClaimTypes.Email).Select(v => v.Value).SingleOrDefault<string>();
            //parsedUser.currentToken = tokenExtract;
            parsedUser.isAdmin = isAdmin;
            var isUS = currentClaim.Claims.Where(claim => claim.Type == "us_citizen").Select(v => v.Value).SingleOrDefault<string>();
            if (isUS != null)
            {
                parsedUser.isUSCitizenAndJPLEmployee = bool.Parse(isUS);
            }

            return parsedUser;
        }

        public void initUser()
        {
            currentUser = parseClaimsUser();
        }

        public UserDto getCurrentUser(bool includeToken = false)
        {
            if (currentUser == null || currentUser.userID == null)
            {
                currentUser = parseClaimsUser();
            }

            if (!includeToken)
            {
                currentUser.currentToken = null;
            }

            return currentUser;
        }

        public bool userIsAdmin()
        {
            return true;
        }
    }
}

Вам нужна только строка services.AddHttpContextAccessor();. Остальное мусор

CKK 31.01.2023 03:20

Можете ли вы поделиться реализацией IAuthService?

sa-es-ir 31.01.2023 03:27

@CKK services.AddHttpContextAccessor() - это то, что у меня было до обновления, но не выдает эту ошибку

eia92 31.01.2023 03:39

@sa-es-ir Я добавил свой IAuthService, но не думаю, что проблема в этом

eia92 31.01.2023 03:42

Нет, я имел в виду класс, реализующий IAuthService!

sa-es-ir 31.01.2023 04:39

@sa-es-ir хорошо, я добавил код для своего AuthService, который реализует IAuthService

eia92 31.01.2023 16:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог выяснить ошибку, которую я получил с моей последней реализацией. Ошибка заключалась в невозможности привести мой dbContext к типу IObjectContextAdapter.

public List<KeyValuePair<string, long>> GetKeys(EntityEntry entry)
{
    var keys = new List<KeyValuePair<string, long>>();
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);

    if (objectStateEntry.EntityKey.EntityKeyValues != null)
    {
        keys.AddRange(objectStateEntry.EntityKey.EntityKeyValues.Select(key => new KeyValuePair<string, long>(key.Key, Convert.ToInt64(key.Value))));
    }

    return keys;
}

Я отрефакторил код, чтобы он выглядел так, и ошибок не было.

public List<KeyValuePair<string, long>> GetKeys(EntityEntry entry)
        {
           //this gets an array of the key names
            var keyNames = entry.Metadata.FindPrimaryKey()
              .Properties
              .Select(p => p.Name)
              .ToArray();

            var keys = new List<KeyValuePair<string, long>>();
            
            if (keyNames != null)
            {
                //creates the KeyValuePairs
                keys.AddRange(keyNames.Select(key => new KeyValuePair<string, long>(key, Convert.ToInt64(entry.Property(key).CurrentValue))));

            }

            return keys;
        }

Другие вопросы по теме