asp.net - pages - net core policies
Crear un usuario en una consola.NET Core Application (2)
En mi aplicación de consola (usada para tareas en segundo plano), quiero crear usuarios, pero ¿cómo puedo tener acceso al objeto UserManager en una aplicación de consola (o en una biblioteca de clases .NET Core)?
Lo mismo que hace en ASP.NET Core. Solo necesita arrancarlo usted mismo. Dentro de su Main
(que es la raíz de la composición de las aplicaciones de la consola, el primer punto donde puede configurar su gráfico de objetos).
Aquí puede crear una instancia de ServiceCollection
, registrar los servicios y construir el contenedor, luego resolver el punto de entrada de la aplicación. A partir de ahí, cualquier otra cosa pasa por DI.
public static int Main(string[] args)
{
var services = new ServiceCollection();
// You can use the same `AddXxx` methods you did in ASP.NET Core
services.AddIdentity();
// Or register manually
services.AddTransient<IMyService,MyService();
services.AddScoped<IUserCreationService,UserCreationService>();
...
// build the IoC from the service collection
var provider = services.BuildServiceProvider();
var userService = provider.GetService<IUserCreationService>();
// we can''t await async in Main method, so here this is okay
userService.CreateUser().GetAwaiter().GetResult();
}
public class UserCreationService : IUserCreationService
{
public UserManager<ApplicationUser> userManager;
public UserCreationService(UserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}
public async Task CreateUser()
{
var user = new ApplicationUser { UserName = "TestUser", Email = "[email protected]" };
var result = await _userManager.CreateAsync(user, model.Password);
}
}
En la práctica, la primera clase que resuelva no será su UserCreationService
sino una clase MainApplication
, que es el núcleo de su aplicación y responsable de mantener la aplicación activa mientras dure la operación, es decir, si es un empleado de segundo plano, ejecuta algún tipo de host (Azure Web Job Host, etc.) que mantiene la aplicación en ejecución para que pueda recibir eventos desde el exterior (a través de un bus de mensajes) y en cada evento inicia un controlador o acción específica, que a su vez resuelve otros servicios, etc.
Tengo una solución ASP.NET Core 1.0 con 3 proyectos (Web, aplicación de consola, DataAccessLayer). Uso ASP.NET Core Identity y Entity Framework Core (SQL Server - Code First).
En mi aplicación de consola (usada para tareas en segundo plano), quiero crear usuarios, pero ¿cómo puedo tener acceso al objeto UserManager en una aplicación de consola (o en una biblioteca de clases .NET Core)?
En una clase de controlador, es fácil con Dependency Injection:
public class AccountController : Controller {
private readonly UserManager<ApplicationUser> _userManager;
public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
{
_userManager = userManager;
}
//...
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
//...
}
¿Cómo puedo hacer el equivalente en una aplicación principal de consola?
Gracias a la respuesta de Tseng terminé con este código. Por si acaso alguien necesitaría:
public class Program
{
private interface IUserCreationService
{
Task CreateUser();
}
public static void Main(string[] args)
{
var services = new ServiceCollection();
services.AddDbContext<ApplicationDbContext>(
options =>
{
options.UseSqlServer("Server=(localdb)//mssqllocaldb;Database=my-app-db;Trusted_Connection=True;MultipleActiveResultSets=true");
});
// Authentification
services.AddIdentity<ApplicationUser, IdentityRole>(opt =>
{
// Configure identity options
opt.Password.RequireDigit = false;
opt.Password.RequireLowercase = false;
opt.Password.RequireUppercase = false;
opt.Password.RequireNonAlphanumeric = false;
opt.Password.RequiredLength = 6;
opt.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddScoped<IUserCreationService, UserCreationService>();
// Build the IoC from the service collection
var provider = services.BuildServiceProvider();
var userService = provider.GetService<IUserCreationService>();
userService.CreateUser().GetAwaiter().GetResult();
Console.ReadKey();
}
private class UserCreationService : IUserCreationService
{
private readonly UserManager<ApplicationUser> userManager;
public UserCreationService(UserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}
public async Task CreateUser()
{
var user = new ApplicationUser { UserName = "TestUser", Email = "[email protected]" };
var result = await this.userManager.CreateAsync(user, "123456");
if (result.Succeeded == false)
{
foreach (var error in result.Errors)
{
Console.WriteLine(error.Description);
}
}
else
{
Console.WriteLine("Done.");
}
}
}
}