扩展UserManager以包括自定义字段ASP.net核心的搜索

Mik*_*idt 2 asp.net-identity asp.net-core-mvc

我将FirstName,LastName,address,CardID等添加到我的应用程序用户的ASP.net Core MVC应用程序中.

我希望能够添加其他功能来搜索该数据库到UserManager类,以根据这些附加属性搜索用户.

例如,它已包含按名称(用户名)查找的功能

_userManager.FindByNameAsync("Mike123")
Run Code Online (Sandbox Code Playgroud)

我希望能够通过CARDID找到用户对象

_userManager.FindByCardIDAsync("123456789")
Run Code Online (Sandbox Code Playgroud)

或者通过地址的多个用户

_userManager.FindByAddressAsync("123 Fake St. Real Town, USA")
Run Code Online (Sandbox Code Playgroud)

我已成功使用此功能

ApplicationUser User = _userManager.Users.FirstOrDefault(u => u.CardID == CardID);
Run Code Online (Sandbox Code Playgroud)

我还是想了解扩展该类的方法,还是应该创建自己的类并继承它?

Luk*_*wej 12

扩展方法怎么样?例如:

using System;
using System.Collections.Generic;
using System.Linq;
using ExampleProject.Models;
using Microsoft.AspNetCore.Identity;

namespace ExampleProject
{
    public static class UserManagerExtensions
    {
        public static ApplicationUser FindByNameAsync(this UserManager<ApplicationUser> um, string name)
        {
            return um?.Users?.SingleOrDefault(x => x.UserName == name);
        }

        public static ApplicationUser FindByCardIDAsync(this UserManager<ApplicationUser> um, string cardId)
        {
            return um?.Users?.SingleOrDefault(x => x.CardID == cardId);
        }

        public static ApplicationUser FindByAddressAsync(this UserManager<ApplicationUser> um, string address)
        {
            return um?.Users?.SingleOrDefault(x => x.Address == address);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但要注意,这是一个简单的例子,只有在Name/CardID/Address是唯一的时候才能正常工作......

SingleOrDefault当Name/CardID /地址不是唯一的时候,我用它作为保护,但我建议再次重新考虑它...我想很难让地址变得独一无二,所以也许你可以找到更好的标准或者你会返回一组用户吗?