首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net Core2.0WebApi:调用DAL类的干净方法,无需在BLL类中实例化dbcontext

.Net Core2.0WebApi:调用DAL类的干净方法,无需在BLL类中实例化dbcontext
EN

Stack Overflow用户
提问于 2018-05-12 13:23:27
回答 1查看 589关注 0票数 1

我有三个程序集,一个模型程序集,一个DAL程序集和我的BLL程序集。现在我想注册一个用户,控制器在我的BLL程序集中被调用,并使数据为DALL程序集中的一个类做好准备,以便将数据添加到de数据库中。

问题是,在我的DAL类中,我使用dbcontext和usermanager类作为标识。现在,当我想实例化我的DALL类时,我需要传递dbcontext和usermanager,这意味着我需要实例化我的控制器中的dbcontext和usermanager,以便将它们传递给我的DALL类。

所以我的问题是:是否有一种干净的方法来调用我的DALL类,而不需要在我的控制器中实例化数据,只需将它传递给我的DALL类。

我的控制器

代码语言:javascript
复制
    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);
    }

My DALL class

代码语言:javascript
复制
    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);
    }

}

事先非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-12 20:13:10

谢谢你的建议。

我以前没有使用过依赖注入,但我已经知道了。

我所做的是,我创建了一个接口,其中包含了DAL类中所需的任务,如下所示:

代码语言:javascript
复制
public interface IApplicationUserStore
{
    Task<IdentityResult> Create(ApplicationUser user, string password);
    Task<ApplicationUser> Get(string email);
}

接下来,我的DAL类实现了如下接口:

代码语言:javascript
复制
    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);
          }

    }

我从控制器中删除了应用程序上下文和用户管理器字段,并将IApplicationUserStore添加到控制器中,如下所示:

代码语言:javascript
复制
    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);
        }

    }
}

最后,在BLL中我的启动类中将applicationdbcontext和IApplicationUserStore添加到依赖容器中。

代码语言:javascript
复制
        services.AddScoped<ApplicationDbContext, ApplicationDbContext>();
        services.AddScoped<IApplicationUserStore, ApplicationUserStore>();

通过这种方式,我的代码是松散耦合的,易于维护。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50306718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档