Используя NerdDinner в качестве базовой ссылки, как выполнять задачи доступа к данным в контроллере? - PullRequest
0 голосов
/ 23 февраля 2010

Я пытаюсь использовать приложение Nerd Dinner MVC в качестве основы для изучения правильного способа разработки приложений MVC.

Я создал интерфейсы и репозитории, как подсказывает ссылочный код, и использую Entity Framework для доступа к данным.

Если я хочу вставить данные, когда пользователь регистрируется в таблице [dbo]. [Users], у меня нет контроллера для пользователей, как мне это сделать?

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, как мне добавить новую запись при регистрации пользователя?

У меня есть отдельная таблица [Users], которую я хочу заполнить, когда новый пользователь регистрируется с добавлением Guid [Aspnet_UserId].

1 Ответ

1 голос
/ 23 февраля 2010

Вам не нужно иметь контроллер для каждой таблицы в вашей базе данных. В приведенном выше коде MembershipService - это код, который фактически создает запись (через репозиторий для пользователей).

Контроллеры должны представлять различные области и группы функций, которые предоставляет ваш сайт. Хотя во многих случаях у вас может быть контроллер с действиями «Просмотр», «Создание» и «Обновление», которые относятся к определенной сущности, которая относится к конкретной таблице базы данных, что не всегда и не всегда так.

Если имеет смысл иметь UsersController, потому что вы хотите просмотреть список пользователей или профиль конкретного пользователя, это нормально, но форма для создания пользователя не обязательно должна быть частью этого контроллера. Иметь членство в членстве, или администраторе, или в учетной записи, или в контроллере регистрации тоже нормально.

Обновление Я постараюсь предоставить вам пример кода, как я ожидаю, что код будет выглядеть. Но вы можете иметь в виду кое-что еще, что тоже хорошо, нет единственно верного способа сделать это.

В вашем коде выше я не уверен, что делает ваш класс MembershipService. Кажется, на нем есть статический метод, который делает что-то, связанное с созданием пользователя. Я ожидаю, что ваш класс 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 в покое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...