使用NerdDinner作为基准参考,如何在控制器中执行数据访问任务?

时间:2010-02-23 18:16:28

标签: asp.net-mvc design-patterns

我正在尝试以Nerd Dinner MVC应用程序为基础来学习开发MVC应用程序的正确方法。

我已经创建了接口和存储库作为参考代码建议并使用Entity Framework进行数据访问。

如果我想在用户注册表[dbo]。[用户]时插入数据,我没有用户控制器,我该怎么做?

AccountController.cs

[HandleError]
public class AccountController : BaseController
{
    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);

            if (createStatus == MembershipCreateStatus.Success)
            {
                // TODO: Enter record into [Users] get reference to [Aspnet_UserId]
                // How do I do this??



                //FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
}

如果我创建一个UsersController来显示基于Users表的视图,那么在用户注册时如何添加新记录呢?

当新用户注册添加[Aspnet_UserId] Guid时,我希望填充一个单独的表[Users]。

1 个答案:

答案 0 :(得分:1)

您不需要为数据库中的每个表都有一个控制器。在上面的代码中,MembershipService是实际创建记录的代码(通过用户的存储库)。

控制器应代表您网站提供的各种区域和功能组。虽然在许多情况下,您可能拥有一个控制器,其中包含与特定实体相关的视图,创建和更新操作,这些操作与特定数据库表相关,但并非总是如此。

如果因为要查看用户列表或特定用户配置文件而拥有UsersController是有意义的,那很好,但创建用户的表单不一定是该控制器的一部分。让它成为会员,管理员,帐户或注册控制器的一部分也是可以的。

<强>更新 我将尝试为您提供我希望代码看起来的示例代码。但是你可能还有别的想法,这也很好,没有真正的单一方法可以做这些事情。

在上面的代码中,我不确定您的MembershipService类正在做什么。它上面有一个静态方法可以执行与User Creation相关的操作。我希望您的MembershipService类应该调用您的UserRepository来实际进行用户创建。但是你可能不会想要一个静态类/方法。

public class MembershipCreationResult
{
  public User Member { get; private set; }
  public MembershipCreateStatus MembershipCreateStatus { get; private set; }

  public MembershipCreationResult(User user, MembershipCreateStatus status)
  {
    Member = user;
    MembershipCreateStatus = status;
  }

  public bool Success
  {
    get { return MembershipCreateStatus == MembershipCreateStatus.Success; }
  }
}

public class MembershipService
{
  public IUserRepository { get; private set; }

  public MembershipService(IUserRepository userRepository)
  {
    UserRepository = userRepository;
  }

  public MembershipCreateResult CreateUser(string name, string password, string email)
  {
    User member = UserRepository.Create(name, password, email);
    bool status = member != null ? MembershipCreateStatus.Success : MembershipCreateStatus.Failure;

    return new MembershipCreationResult(status, member)
  }
}

我没有仔细查看NerdDinner示例,我没有使用ASP.NET成员资格提供程序,但我上面概述的概念应该有效。如果MembershipService的行为与我概述的不同,那么您可以创建一个新服务来包装功能并保留现有的MembershipService。