繁体   English   中英

如果您的模型与持久性无关,那么如何保存它们?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM