我是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领域,我的控制器基本上只能访问模型和视图。
答案 0 :(得分:2)
你做得很好。 ActiveRecord vs Repository vs Home Brew DAL是一个永恒的问题,我们将永远讨论。
repository pattern现在在.NET世界中非常流行,你可能会看到很多它的用法示例。 MVC并不关心您的数据访问策略是什么。使用你认为舒服的任何东西都是好的,比使用模式更好的策略,因为其他人都在这样做。
答案 1 :(得分:1)
模型可以使用Save()函数,但通常希望Save()行为独立于模型 - 抽象到接口。
记住你的设计原则:设计界面,而不是实现。
另一个警告是你如何单独测试你的作品?如果模型不知道它是如何持久化的,可以根据模型应该做什么进行测试,并且可以根据应该做什么来测试持久性机制
在任何情况下,看起来你的Create()动作都在执行双重任务 - 尝试使用模型保存,然后尝试使用DataAccess来保持。这两个对象是否做同样的事情?以后这可能会令人困惑或难以理解/不可维护吗?