Если ваши модели не зависят от настойчивости, как вы их сохраните? - PullRequest
1 голос
/ 04 февраля 2011

Я новичок в ASP.NET MVC, пришедший из PHP MVC. Это был своего рода неловкий переход (см. Мою историю вопросов, хех.)

Одна вещь, которая мне очень нравится в теории, которая является большой в мире .Net, - это идея о том, что модели не зависят от настойчивости. Но в этом случае, как правильно сохранить изменения в модели? В PHP я бы просто позвонил $model->save(); после некоторого преобразования. В C # я не уверен, как это сделать.

Это уместно?

public class AwesomesauceController
{
    //inject!
    public AwesomeSauceController(IDataAccess da)
    {
        DataAccess = da;    
    }
    private readonly IDataAccess DataAccess;

    [HttpGet]
    public ActionResult Edit(int Id)
    {
        // PHP equiv: AwesomeSauceModel::find($id); Controller is unaware of DAL
        return View(DataAccess.AwesomeSauces.Where( sc => sc.Id == Id).FirstOrDefault());
    }

    [HttpPost]
    public ActionResult Edit(AwesomeSauce sc)
    {
        //persistence-aware version: model is aware of DAL, but controller is not
         if($sc->valid()
            $sc->save(); 
            redirect(); 
        }
        else { return view(); }

        // compare to persistence-agnostic version, controller is aware of DAL, but model is not
        if(ModelState.IsValid)
        {
            da.Persist(sc);
            return Redirect();
        }
        else
        {
            return View(sc);
        }
    }
}

Полагаю, единственное, что меня не устраивает, это то, что обычно я не хотел бы, чтобы контроллер получал прямой доступ к уровню доступа к данным таким образом. Ранее, на земле PHP, мои контроллеры, в основном, обращались только к моделям и представлениям.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

То, что вы делаете, прекрасно. ActiveRecord vs Repository vs Home Brew DAL - это вечный вопрос, который мы будем обсуждать вечно.

Шаблон репозитория сейчас очень популярен в мире .NET, и вы, вероятно, увидите множество примеров его использования. MVC все равно, какая у вас стратегия доступа к данным. Использование того, что вам удобно, - это просто хорошо и лучшая стратегия, чем использование шаблона, потому что все остальные делают это.

1 голос
/ 04 февраля 2011

Это нормально для модели иметь функцию Save (), но вы обычно хотели бы, чтобы поведение Save () было независимым от вашей модели - абстрагировано от интерфейса.

Запомните свои принципы дизайна: дизайн интерфейса, а не реализация.

Еще одна оговорка: как вы тестируете свои произведения индивидуально? Если модель не знает, как она сохраняется, ее можно протестировать на основе того, что модель должна сделать, и ваш механизм персистентности можно проверить на основе того, что она должна сделать. 1009 *

В любом случае, похоже, что ваше действие Create () выполняет двойную обязанность - пытается использовать модель для сохранения, а затем пытается использовать DataAccess для сохранения. Эти два объекта делают то же самое? Может ли это быть сбивающим с толку или нечитаемым / не поддерживаемым позже?

...