Расширение AspNetCore.Identity.EntityFrameworkCore.UserStore (V2.1.3) - PullRequest
0 голосов
/ 15 ноября 2018

Я просто хочу расширить пользовательское хранилище и добавить дополнительный метод.Я не могу определить правильный конструктор customuserstore.Как определить конструктор

public class MyCustomUserStore<TUser> : Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>, IUserLdapStore<TUser>
    where TUser : class
{
    // constructor goes here

    public Task<string> GetDistinguishedNameAsync(TUser user)
    {
        return Task.FromResult(string.Empty);
    }
}

public interface IUserLdapStore<TUser>
    where TUser : class
{
    /// <summary>
    /// When implemented in a derived class, gets the DN that should be used to attempt an LDAP bind for validatio of a user's password.
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    Task<string> GetDistinguishedNameAsync(TUser user);
}

Получение следующих ошибок:

Тип '`TUser' нельзя использовать в качестве параметра типа 'TUser' в универсальном типе или методе 'UserStore'.

Не существует неявного преобразования ссылок из' TUser 'в' Microsoft.AspNetCore.Identity.IdentityUser '.

' TUser 'должен быть неабстрактного типа с открытым конструктором без параметровчтобы использовать его в качестве параметра 'TUser' в универсальном типе или методе 'UserStore

Не указан аргумент, который соответствует необходимому формальному параметру' context 'в' UserStore.UserStore (DbContext, IdentityErrorDescriber) '

1 Ответ

0 голосов
/ 15 ноября 2018

Внимательно просматривая сообщение об ошибке, вы, кажется, упускаете возможность добавить ограничение для TUser, которое вынуждает его наследовать от IdentityUser<string>.Это унаследованное ограничение от Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>.

Добавление этого ограничения в ваш пользовательский магазин выглядит примерно так:

public class MyCustomUserStore<TUser> : Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>, IUserLdapStore<TUser>
    where TUser : IdentityUser<string>, new()
{
    //constructor goes here....

    public Task<string> GetDistinguishedNameAsync(TUser user)
    {
        return Task.FromResult(string.Empty);
    }
}

Спасибо @KirkLarkin за указание второй ошибки, которую я полностью пропустил.

Не указан аргумент, который соответствует необходимому формальному параметру 'context' для 'UserStore.UserStore (DbContext, IdentityErrorDescriber)'

Ошибка немного загадочная,но это легко решаемо, если мы предоставим конструктор для пользовательского хранилища, предоставив параметры для базового класса:

public MyCustomUserStore(DbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
}

Собрав все это вместе, класс должен выглядеть следующим образом:

public class MyCustomUserStore<TUser> : Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>, IUserLdapStore<TUser>
    where TUser : IdentityUser<string>, new()
{
    public MyCustomUserStore(DbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
    {
    }

    public Task<string> GetDistinguishedNameAsync(TUser user)
    {
        return Task.FromResult(string.Empty);
    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...