【问题标题】:Use UserManager as interface使用 UserManager 作为接口
【发布时间】:2021-08-12 14:52:22
【问题描述】:

我正在使用 ASP.NET Core 标识
我想观察 DIP 并创建一个界面

public interface IUserManagerService : IDisposable
{
    Task<IdentityResult> CreateAsync(User user, string password);
}

实现类是

public class UserManagerService : UserManager<User>, IUserManagerService
{
    public UserManagerService()
    : base()
    {

    }
}

现在我不知道应该将哪些参数传递给基类
我该如何解决?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-identity asp.net-core-5.0


    【解决方案1】:

    根据您的描述,您希望使用 UserManager 创建一个服务,然后使用它来管理用户。如果是这种情况,您可以参考以下示例代码:

    public interface IUserManagerService:IDisposable
    {
         Task<IdentityResult> CreateAsync(User user, string password);
    }
    
    public class UserManagerService : IUserManagerService
    {
        //request the UserManger service and call the relate methods.
        private readonly UserManager<IdentityUser> usermanager;
        public UserManagerService(UserManager<IdentityUser> userManager)
        {
            usermanager = userManager;
        }
        public async Task<IdentityResult> CreateAsync(User user, string password)
        {
            var identityuser = new IdentityUser { UserName = user.UserName, Email = user.Email };
            var result = await usermanager.CreateAsync(identityuser, password);
    
            return result;
        }
    
        public void Dispose()
        {
            Console.WriteLine("- IUserManagerService was disposed!");
        }
    }
    

    用户模型:

    public class User
    {
        public string UserName { get; set; }
        public string Email { get; set; }
    }
    

    然后,使用具体类型 UserManagerService 注册 IUserManagerService 服务:

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDatabaseDeveloperPageExceptionFilter();
    
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    
    services.AddScoped<IUserManagerService, UserManagerService>();
    

    然后,在 MVC 控制器中,请求 IUserManagerService 服务,并调用其方法创建用户:

    public class HomeController : Controller
    { 
        private readonly IUserManagerService userManagerService;
        public HomeController(IUserManagerService userManager)
        { 
            userManagerService = userManager;
        }
    
        public IActionResult Index()
        {
    
            var newuser = new User() { UserName = "Tom", Email = "tom121@hotmail.com" };
            var password = "Password123!";
            var result = userManagerService.CreateAsync(newuser, password);
            if (result.Result.Succeeded)
            {
               //do some thing
            }
            return View();
        }
    

    结果如下:

    更多详细信息,请参考Dependency injection in ASP.NET Core

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多