2016-11-15 3 views
2

У меня есть решение ASP.NET Core 1.0 с тремя проектами (веб-приложение, консольное приложение, DataAccessLayer). Я использую базовый идентификатор ядра ASP.NET и ядро ​​платформы Entity Framework (SQL Server - Code First).Создание пользователя в консоли .NET Core Application

В моем приложении консоли (используется для фоновых задач) я хочу создавать пользователей, но как я могу иметь доступ к объекту UserManager в консольном приложении (или в библиотеке классов .NET Core)?

В классе контроллера, легко с 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); 

    //... 
} 

Как я могу сделать эквивалент в сердцевине консольного приложения?

+0

Не было бы проще создать для этого действие API и вызвать «создание пользователя Api» из консольной программы? –

ответ

3

В моем приложении консоли (используется для фоновых задач) я хочу создавать пользователей, но как я могу иметь доступ к объекту UserManager в консольном приложении (или в библиотеке классов .NET Core)?

То же, что и в ASP.NET Core. Вам просто нужно самому загрузить его. Внутри вашего Main (это консольные приложения composition root - самая ранняя точка, где вы можете настроить свой график объектов).

Здесь вы создаете экземпляр ServiceCollection, регистрируете службы и создаете контейнер, а затем разрешаете точку входа в приложение. Оттуда все что-то происходит через 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); 
    } 
} 

На практике первого класса вы решить не будет ваш UserCreationService но некоторые MainApplication класса, который является основой вашего приложения и ответственности за сохранение приложения в живых до тех пор, пока операция происходит, то есть, если его фоновый рабочий, вы запускаете какой-то хост (Azure Web Job Host и т. д.), который заставляет приложение работать, чтобы он мог получать события извне (через некоторую шину сообщений) и на каждом событии запускает определенный обработчик или действие, которое, в свою очередь, разрешает другие услуги и т. д.

+0

Спасибо Tseng :) – orrel

3

Благодаря ответу Цзэн я получил этот код. На всякий случай, если кому-то понадобится:

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."); 
       } 
      } 
     } 
    }