我使用标准MVC模板,可以愉快地创建用户并将其添加到我的控制器中的角色。
我的问题是我可以从我的某个模型中做到这一点吗?
澄清我想将新用户逻辑从我的控制器移到我的UserSetting类
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(UserSettingsViewModel model)
{
if (ModelState.IsValid)
{
UserSetting userSetting = new UserSetting(model);
UserSetting.Create(userSetting);
}
}
我的用户设置类:
public class UserSetting : Controller
{
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
public static void Create(UserSetting userSetting)
{
switch (userSetting.AccountType)
{
// InternalUser
case 0:
AddOrUpdateInternalUser(userSetting);
break;
// ExternallUser
case 1:
AddOrUpdateExternalUser(userSetting);
break;
// InternaDoctor
}
}
public async void AddOrUpdateInternalUser(UserSetting userSetting)
{
var db = new V2Context();
db.UserSettings.AddOrUpdate(userSetting);
await UserManager.RemoveFromRolesAsync(userSetting.UserName, UserManager.GetRoles(userSetting.UserName).ToString());
await UserManager.AddToRolesAsync(userSetting.UserName, "newrole");
db.SaveChanges();
}
}
答案 0 :(得分:0)
老实说,你的代码对我来说并不是太糟糕,至少在简洁的意义上。控制器应该负责处理数据库这样的事情,所以我不认为你需要抽象出任何一个。你可以通过在辅助类上调用一个方法将三行代码转换成一行,但从长远来看,这确实有什么不同吗?不,事实上,有人可能会说你实际上正在添加复杂性,这样你现在必须在两个地方而不是一个地方看,只是为了移出这么少量的代码
此外,如果您要将此代码移出到帮助程序类,那么您还需要将上下文注入其中。许多开发人员在尝试在另一个类中创建其上下文时犯了致命的错误,这只会导致问题。
就个人而言,我只是试着保持我的动作方法很轻,并在控制器上创建受保护的方法,这些动作可以用来完成繁重的工作。这与Microsoft在其示例代码中遵循的身份相同。长和短,将代码保留在控制器中,除非有一个特别好的理由将其移出。
如果您的操作过于繁重,请在控制器上将代码重构为私有/受保护的方法(取决于您是否关心能够将控制器子类化)。然后,如果您有适用于多个控制器的代码,请将其分解为每个可以使用的辅助类。