asp.net mvc без структуры лица - PullRequest
13 голосов
/ 13 октября 2011

Я изучаю asp.net mvc и прошел отличный урок, который продемонстрировал это. В учебнике также используется Entity Framework.

У нас есть собственный класс доступа к данным, который я должен использовать. Я немного сбит с толку относительно того, что мне нужно сделать, чтобы преодолеть разрыв между нашим классом и платформой MVC. Например, в руководстве, внутри файла MovieController.cs, есть метод Edit, который выглядит следующим образом:

[HttpPost]
        public ActionResult Edit(Movie movie)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movie).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(movie);
        }

Если бы я не использовал платформу Entity, как бы она выглядела? Нужно ли мне по-прежнему использовать ModelState.IsValid и сохранять состояние, как будто оно сделано

db.Entry(movie).State = EntityState.Modified;

Пожалуйста, сообщите. Четко написанный пример использования asp.net mvc без использования платформы Entity был бы великолепен.

Что мне нужно знать, так это то, какую роль играет здесь государство и является ли оно обязательным для использования или это только часть того, как работает платформа Entity.

Я бы переписал это как:

[HttpPost]
public ActionResult Edit(Movie movie)
{
    myDBObject.SaveChanges();
    return RedirectToAction("Index");

}

Где myDBObject - мой пользовательский объект доступа к базе данных.

Ответы [ 4 ]

22 голосов
/ 13 октября 2011

Примеры, которые вы видите там, где контроллеры напрямую используют некоторую инфраструктуру доступа к данным, такую ​​как Entity Framework, являются плохими примерами. Весь интернет загрязнен такими вещами. Я не могу смотреть на это, не повредив глаза. Я считаю это плохой практикой. Доступ к данным должен быть отделен и удален в хранилище. Так, например:

public interface IMoviesRepository
{
    Movie Get(int id);
    void Save(Movie movie);
}

тогда вы могли бы иметь некоторую реализацию этого интерфейса, используя обычный ADO.NET, EF, NHibernate, вызов удаленной веб-службы, некоторый пользовательский ORM или что-то еще:

public class MyCustomFrameworkMoviesRepository: IMoviesRepository
{
    ...
}

и контроллер примет этот интерфейс хранилища в качестве аргумента конструктора:

public class MoviesController: Controller
{
    private readonly IMoviesRepository _repository;
    public MoviesController(IMoviesRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index(int id)
    {
        var movie = _repository.Get(id);
        return View(movie);
    }

    [HttpPost]
    public ActionResult Index(Movie movie)
    {
        if (!ModelState.IsValid)
        {
            return View(movie);
        }

        _repository.Save(movie);
        return RedirectToAction("Success");
    }
}

и последняя часть заключается в настройке вашей структуры внедрения зависимостей для передачи правильной реализации хранилища в контроллер. Теперь, как вы видите, способ извлечения данных полностью отделен от логики контроллера. Так и должно быть. Всегда старайтесь избегать сильной связи между различными уровнями вашего приложения.

И чтобы ответить на ваш вопрос о государственной собственности: это нечто совершенно специфичное для EF, видеть что-то подобное в контроллере очень жаль.

И чтобы сделать это еще лучше и улучшить, вы бы представили модели представлений. Модели представлений - это классы, специально разработанные для удовлетворения требований данного представления. Так, например, Movie - это модель предметной области. Модели доменов никогда не должны передаваться напрямую в представления. Действия контроллера никогда не должны принимать доменные модели в качестве аргументов действия. Вы должны определить модели представления, которые будут содержать только то, что требуется для данного представления, а затем выполнить сопоставление между моделями представления и моделями домена. Такие фреймворки, как AutoMapper делают это очень простым.

2 голосов
/ 13 октября 2011

хмм.

MVC и структура сущностей действительно не имеют ничего общего друг с другом;они просто хорошо работают вместе.

if (ModelState.IsValid) проверяет вашу модель представления.Если вы не используете объекты просмотра с валидаторами, это немного бессмысленно;если да, то это очень ценно.

в скобках if (ModelState.IsValid), вы бы взяли данные поста с вашей веб-страницы (обычно это модель представления) и применили их к объекту, который сохранит их вбаза данных.EF часто используется, потому что после установки его довольно легко поддерживать, и кода для написания гораздо меньше.

            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();

связаны с EF.Их необходимо будет заменить методами и объектами вашего класса репозитория.

            return RedirectToAction("Index");

- это MVC.После успешного сохранения в вашем хранилище данных верните элемент управления на страницу индекса.

        return View(movie);

используется для перенаправления обратно в исходное представление, поскольку что-то не прошло проверку.

1 голос
/ 13 октября 2011

Вы бы все равно отметили ModelState.IsValid, но в противном случае ваш код выглядел бы так, как у вас.

Это предполагает, что ваша модель имеет атрибуты DataAnnotations, хотя это то, что ModelState.IsValidиспользуя для проверки.Эти атрибуты можно использовать в любых свойствах класса C #, а не только в Entity Framework.

Возможно, в конечном итоге вы создадите конкретные модели представления для этой цели.

0 голосов
/ 13 октября 2011

Вам необходимо установить некоторую связь между объектом Movie (переданным в http POST) и методами вашей базы данных (myDBObject).

Может быть, вы хотите сказать myDBObject.SaveChanges(movie) и предположить, что ваш код БД знает какчтобы справиться с объектом Movie, тогда все будет в порядке.

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