ASP.NET Не удается получить доступ к расширенному хранилищу пользователей

У меня возникли проблемы с расширением моего CustomUserStore..

Как вы можете видеть по следующей ссылке, у магазина есть правильный UserStore (мой пользовательский): введите здесь описание изображения Но при попытке вызвать пользовательский метод я сразу же получаю ошибку компилятора , в котором говорится следующее: KoUserManager.cs(19, 26): [CS1061] 'IUserStore<KoUser>' does not contain a definition for 'Test' and no accessible extension method 'Test' accepting a first argument of type 'IUserStore<KoUser>' could be found (are you missing a using directive or an assembly reference?)

Я пробовал несколько вещей, но единственный рабочий способ сейчас - это создать отдельный объект в моем UserManager и передать его в Custom UserStore. Но это просто создаст второй объект.

Вот мои соответствующие файлы для этого:

IKoUserStore

KoUserStore

IKoPasswordStore

KoUserManager

Запуск

Как вы можете видеть на этом рисунке, моя IDE также не показывает мне возможности для вызова метода (перед именем: FindByMailAsync): введите здесь описание изображения

Насколько я понимаю, services.AddTransient<IKoUserStore<KoUser>, KoUserStore>(); должен справиться с этой реализацией. Также я создал пользовательские интерфейсы для их расширения (и пусть они наследуют). Но я все еще не мог понять, почему я не могу вызвать расширенный метод, даже если правильный UserStore (KoUserStore) реализован как видно на отладочной картинке..

PS: Я мог найти в Researchin похожую проблему, для которой также нет решения.

Специально эта часть:

Итак, теоретически... если внедрение зависимостей разрешает типы IUserStore в RavenUserStore, когда они внедряются через конструктор... не должно ли это означать, что UserManager получает RavenUserStore в качестве свойства Store?

Основная идентификация ASP.NET — проблемы UserManager и UserStore


person Lenon    schedule 16.11.2019    source источник


Ответы (1)


Поскольку UserManager.Store имеет тип IUserStore<TUser>, ваше приведение в конструкторе KoUserManager не действует. Вы можете переместить это приведение в метод Test/XYZ или использовать отдельную переменную, чтобы получить доступ к пользовательскому методу.

Изменить: вот пример:

public void Test() {
    var koUserStore = (IKoUserStore<KoUser>) Store;
    koUserStore.Test();
    // ...
}

Редактировать: в отладчике вы видите run-time type (KoUserStore) переменной, но в целом у вас есть доступ только к членам класса compile-time type (IUserStore<TUser>), поэтому вам нужно будет выполнить приведение. См. этот ответ для получения дополнительной информации.

Edit2: когда вы выполняете приведение, создается только ссылка, так что это должно быть хорошо, за исключением того, что у вас есть очень конкретная причина, по которой это не так (см. этот вопрос для получения дополнительной информации).

person user7217806    schedule 17.11.2019
comment
Перемещение литья также не будет работать и будет иметь ту же ошибку/результат, что и выше. - person Lenon; 17.11.2019
comment
Я добавил пример. - person user7217806; 18.11.2019
comment
О, я, очевидно, сказал это немного неправильно. Как и выше: единственный рабочий способ сейчас — создать отдельный объект в моем UserManager и передать его в Custom UserStore. Но это просто создаст второй объект. Есть ли другой способ, без создания второго Объекта. Потому что мне кажется, что это просто своего рода ошибка, потому что в отладчике я мог видеть материал KoUserStore. - person Lenon; 19.11.2019
comment
Я (очень поздно, извините) обновил ответ, чтобы прояснить поведение. - person user7217806; 20.05.2020