如果你的模型是持久性不可知的,你如何保存它们?

时间:2011-02-04 17:41:46

标签: asp.net-mvc model-view-controller language-agnostic persistence-ignorance

我是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 个答案:

答案 0 :(得分:2)

你做得很好。 ActiveRecord vs Repository vs Home Brew DAL是一个永恒的问题,我们将永远讨论。

repository pattern现在在.NET世界中非常流行,你可能会看到很多它的用法示例。 MVC并不关心您的数据访问策略是什么。使用你认为舒服的任何东西都是好的,比使用模式更好的策略,因为其他人都在这样做。

答案 1 :(得分:1)

模型可以使用Save()函数,但通常希望Save()行为独立于模型 - 抽象到接口。

记住你的设计原则:设计界面,而不是实现。

另一个警告是你如何单独测试你的作品?如果模型不知道它是如何持久化的,可以根据模型应该做什么进行测试,并且可以根据应该做什么来测试持久性机制

在任何情况下,看起来你的Create()动作都在执行双重任务 - 尝试使用模型保存,然后尝试使用DataAccess来保持。这两个对象是否做同样的事情?以后这可能会令人困惑或难以理解/不可维护吗?