【问题标题】:Can't Find User By ID无法通过 ID 找到用户
【发布时间】:2017-02-03 22:56:10
【问题描述】:

我正在尝试创建一个“用户服务”类,我只公开需要通过此操作的方法。其中一种方法是 FindById。这是我的代码:

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;

public interface IUserService : IDisposable
{
    Task<CustomUser> FindByIdAsync(string userId);
    ICustomUser FindById(string userId);
}

public class UserService : UserManager<CustomUser>, IUserService
{
    public UserService(IUserStore<CustomUser> store, IDataProtectionProvider dataProvider)
        : base(store)
    {
        UserValidator = new UserValidator<CustomUser>(this)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        PasswordValidator = new PasswordValidator
        {
            RequiredLength = 8,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        UserLockoutEnabledByDefault = true;
        DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(1);
        MaxFailedAccessAttemptsBeforeLockout = 5;

        var dataProtectionProvider = dataProvider;
        if (dataProtectionProvider != null)
        {
            UserTokenProvider =
                new DataProtectorTokenProvider<CustomUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
    }

    public new async Task<ICustomUser> FindByIdAsync(string userId)
    {
        return await base.FindByIdAsync(userId);
    }

    public ICustomUser FindById(string userId)
    {
        return base.FindById(userId);
    }
}

FindByIdAsync 方法工作正常,但 FindById 方法甚至无法编译。我的自动完成提示该方法存在,但是当我输入它时,它变成红色并显示:

Microsoft.AspNet.Identity.UserManager 不包含 FindById 的定义

我做错了什么?

编辑:

FindById 来自 UserManagerExtensions(请参阅 https://msdn.microsoft.com/en-us/library/dn497471(v=vs.108).aspx)。这是否意味着我必须以某种方式扩展扩展类?我真正想做的就是允许通过我的接口 IUserService 使用这个方法,但是在那里添加一个引用会迫使我实现一个方法,正如你在上面看到的那样,我试图做的很少成功

【问题讨论】:

  • 为什么投反对票?
  • 与往常一样 - 如果您注意错误,则最有帮助:此错误告诉您没有 findbyid。而且没有。请参阅 MSDN:msdn.microsoft.com/en-us/library/dn613290(v=vs.108).aspx
  • @trailmax FindByIdAsync 方法工作正常,我正在尝试让 FindById 方法工作
  • @ShannonHolsinger 我阅读了错误消息,但是根据多个来源,这里有一个stackoverflow.com/questions/20925822/… 我应该可以通过 UserManager 调用该方法,而这个类就是那个 UserManager。 IntelliSense 还向我显示该方法存在。这就是为什么我对此感到如此困惑。
  • @ShannonHolsinger 嘿伙计,感谢您的帮助,即使它以一种不必要的粗鲁形式出现,我确实如此,但根据文档:msdn.microsoft.com/en-us/library/dn497471(v=vs.108).aspx 它应该来自扩展。那么看看我是如何引用它的,为什么它不允许我使用它? IntelliSense 可以看到它。

标签: c# asp.net-mvc-5 entity-framework-6 asp.net-identity


【解决方案1】:

You can't call an extension method for base

原因似乎是你不能将base作为参数传递,而扩展方法是什么。

您可以像这样在静态上下文中调用该方法,而不是作为扩展。

public ICustomUser FindById(string userId)
{
    return UserManagerExtentions.FindById(this, userId);
}

【讨论】:

  • 虽然您说我们不能从基础调用扩展方法是正确的,但在我的示例中,我不是从基础调用它,而是从扩展该基础的类调用它。因此,我应该(而且我确实)可以访问该方法。但是,真正的问题在于,由于扩展名,我不能在子类名中使用相同的方法名,如果这样做,它将隐藏扩展名,并且子类本身将无法调用它。它进入调用自身的无限循环。解决这个问题的方法是调用其他方法。至少这是我采用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2021-10-15
  • 2016-09-02
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多