.Net Core 2.0 Web Api: чистый способ вызова класса DAL без необходимости создания экземпляра dbcontext в классе BLL - PullRequest
0 голосов
/ 12 мая 2018

У меня есть три сборки, сборка Model, сборка DAL и сборка BLL.Теперь я хочу зарегистрировать пользователя, контроллер вызывается в моей сборке BLL и готовит данные для класса в сборке DALL для добавления данных в базу данных de.

Проблема в том, что в моем классе DAL я использую свой dbcontext и класс usermanager из идентификатора.Теперь, когда я хочу создать экземпляр своего класса DALL, мне нужно передать dbcontext и usermanager, это означает, что мне нужно создать экземпляр dbcontext и usermanager в моем контроллере, чтобы просто передать их моему классу DALL.

Так что мойВопрос в том, существует ли чистый способ вызова моего класса DALL без необходимости создания экземпляров данных в моем контроллере, чтобы просто передать их моему классу DALL.

Мой контроллер

    public class UserController : Controller
{
    private ApplicationDbContext _context;
    private IPasswordHasher<ApplicationUser> _passwordHasher;
    private UserManager<ApplicationUser> _userManager;

    private ApplicationUserStore _userStore;

    public UserController(ApplicationDbContext _context, IPasswordHasher<ApplicationUser> passwordHasher, UserManager<ApplicationUser> userManager)
    {
        _passwordHasher = passwordHasher;
        _userManager = userManager;
        _userStore = new ApplicationUserStore(_context, _userManager);
    }

    [AllowAnonymous]
    [HttpPost("create")]
    public async Task<IActionResult> Create([FromBody] CreateApplicationUserViewModel model)
    {
        var user = new ApplicationUser()
        {
            Email = model.Email,
            UserName = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName
        };
        var result = await _userStore.Create(user);

        if (result.Succeeded)
        {
            try
            {
                _passwordHasher.HashPassword(user, model.ConfirmPassword);
                return Ok();
            }
            catch (Exception ex)
            {
                return BadRequest(ex);
            }
        }

        foreach (var error in result.Errors)
        {
            ModelState.AddModelError("error", error.Description);

        }
        return BadRequest(result.Errors);
    }

Мой класс DALL

    public class ApplicationUserStore
{
    private ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;

    public ApplicationUserStore(ApplicationDbContext ctx, UserManager<ApplicationUser> userManager)
    {
        _context = ctx;
        _userManager = userManager;
    }

    public async Task<ApplicationUser> Get(string id)
    {
        return await _context.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
    }

    public async Task<IdentityResult> Create(ApplicationUser user)
    {
       return await _userManager.CreateAsync(user);
    }

}

Большое спасибо заранее

1 Ответ

0 голосов
/ 12 мая 2018

Спасибо за предложение.

Раньше я не использовал инъекцию зависимостей, но понял это.

Что я сделал, так это Я создал интерфейс с задачами, необходимыми для моего класса DAL, например:

public interface IApplicationUserStore
{
    Task<IdentityResult> Create(ApplicationUser user, string password);
    Task<ApplicationUser> Get(string email);
}

затем мой класс DAL реализует такой интерфейс:

    public class ApplicationUserStore : IApplicationUserStore
    {
         private ApplicationDbContext _context;
         private readonly UserManager<ApplicationUser> _userManager;

         public ApplicationUserStore(ApplicationDbContext ctx, 
         UserManager<ApplicationUser> userManager)
         {
            _context = ctx;
            _userManager = userManager;
         }

         public async Task<ApplicationUser> Get(string email)
         {
             return await _context.Users.Where(u => u.Email == 
             email).SingleOrDefaultAsync();
         }

          public async Task<IdentityResult> Create(ApplicationUser user, 
          string password)
          {
               return await _userManager.CreateAsync(user, password);
          }

    }

Я удалил поля applicationcontext и usermanager из моего контроллера и добавил IApplicationUserStore в мой контроллер следующим образом:

    public class UserController : Controller
{
    private IApplicationUserStore _userStore;

    public UserController(IApplicationUserStore userStore)
    {
        _userStore = userStore;
    }

    [AllowAnonymous]
    [HttpPost("create")]
    public async Task<IActionResult> Create([FromBody] CreateApplicationUserViewModel model)
    {
        var user = new ApplicationUser()
        {
            Email = model.Email,
            UserName = model.Email,
            FirstName = model.FirstName,
            LastName = model.LastName
        };
        var result = await _userStore.Create(user, model.Password);

        if (result.Succeeded)
        {
            return Ok();
        }
        else
        {
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError("error", error.Description);

            }
            return BadRequest(result.Errors);
        }

    }
}

и наконец добавил applicationdbcontext и IApplicationUserStore в контейнер зависимостей, как это в моем классе запуска в BLL.

        services.AddScoped<ApplicationDbContext, ApplicationDbContext>();
        services.AddScoped<IApplicationUserStore, ApplicationUserStore>();

Таким образом, мой код свободно связан и прост в обслуживании.

...