c# - .Net Core 2.0 Web Api:调用 DAL 类的简洁方法,无需在 BLL 类中实例化 dbcontext
问题描述
我有三个程序集,一个模型程序集,一个 DAL 程序集和我的 BLL 程序集。现在我想注册一个用户,在我的 BLL 程序集中调用一个控制器,并为 DALL 程序集中的一个类准备好数据,以便将数据添加到数据库中。
问题是,在我的 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);
}
}
提前谢谢了
解决方案
谢谢你的建议。
我以前没有使用过依赖注入,但我已经弄清楚了。
我所做的是,我创建了一个接口,其中包含我的 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);
}
}
}
最后在我的 BLL 启动类中将 applicationdbcontext 和 IApplicationUserStore 添加到依赖容器中。
services.AddScoped<ApplicationDbContext, ApplicationDbContext>();
services.AddScoped<IApplicationUserStore, ApplicationUserStore>();
通过这种方式,我的代码是松耦合且易于维护的。
推荐阅读
- angular - 上下文菜单上的文件元素未定义 - 为什么?
- php - 我的表单总是告诉用户有问题
- sql - 如何提取与特定模式匹配的所有字符串并在 SQL 中爆炸为行
- algorithm - 将数组分成两部分(某些元素可以单独保留),使得两部分之和最大
- ios - 使用 LanguageManager-iOS-Lokalise0.1.3 在单击按钮上不会更改 IOS 应用程序语言
- python - 如何将从实时方法调用接收的字节 jpeg 数据转换为可读/可管理的格式
- tensorflow - 从 anaconda 安装中导入 jupyter 和 sypder 中的 tensroflow 时遇到问题
- r - 带有雨果(学术主题)的 R 博客的雨果警告:我需要做些什么吗?
- ios - Firebase 创建动态链接在本机 iOS 中不起作用。但是它似乎在android中工作正常
- react-native-android - 最近我将我的 expo-cli 更新到 3.13.1 版本,突然应用程序无法正常工作