[英]If your models are persistence agnostic, how do you save them?
我是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领域,我的控制器基本上只能访问模型和视图。
你在做什么很好。 ActiveRecord与存储库与Home Brew DAL是一个永恒的问题,我们将永远讨论。
现在, 存储库模式在.NET世界中非常流行,您可能会看到许多使用它的示例。 MVC不在乎您的数据访问策略是什么。 比起使用模式,使用任何您认为舒适的东西都是更好的策略,因为其他所有人都在这样做。
模型具有Save()函数是可以的,但是您通常希望Save()行为与模型无关-抽象到接口。
记住您的设计原则:设计接口,而不是实现。
另一个警告是您如何分别测试作品? 如果模型不知道它是如何坚持,它可以基于模型应该做的测试,你的持久化机制可以基于它应该做的测试。
无论如何,您的Create()动作似乎都承担着双重责任-尝试使用模型进行保存,然后尝试使用DataAccess进行持久化。 这两个对象是否在做同一件事? 以后是否可能造成混淆或无法读取/无法维护?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.