Frage

Ich bin neu bei ASP.NET MVC und habe einen PHP-MVC-Hintergrund.Es war ein ziemlich unangenehmer Übergang (siehe meinen Fragenverlauf, heh.)

Eine Sache, die mir in der Theorie sehr gefällt und die in der .Net-Welt eine große Rolle spielt, ist die Idee, dass Modelle persistenzunabhängig sind.Aber wie können in diesem Fall Änderungen an einem Modell richtig gespeichert werden?In PHP würde ich einfach anrufen $model->save(); nach einigen Transformationen.In C# bin ich mir nicht sicher, wie das geht.

Ist das angemessen?

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);
        }
    }
}

Ich denke, das Einzige, was mir daran falsch vorkommt, ist, dass ich normalerweise nicht möchte, dass ein Controller auf diese Weise direkt auf eine Datenzugriffsschicht zugreift.Bisher haben meine Controller im PHP-Bereich grundsätzlich nur auf Modelle und Ansichten zugegriffen.

War es hilfreich?

Lösung

Was Sie tun, ist in Ordnung.ActiveRecord vs Repository vs Home Brew DAL ist eine ewige Frage, die wir für immer diskutieren werden.

Das Repository-Muster ist im Internet sehr beliebtDie .NET-Welt im Moment und Sie werden wahrscheinlich viele Beispiele für ihre Verwendung sehen.MVC ist es jedoch egal, wie Ihre Datenzugriffsstrategie aussieht.Es ist in Ordnung und eine bessere Strategie, alles zu verwenden, was Sie für bequem halten, als ein Muster zu verwenden, da alle anderen dies tun.

Andere Tipps

Es ist in Ordnung, dass ein Modell eine speichern () -Funktion hat, aber Sie möchten normalerweise, dass das Verhalten von speichern ()) unabhängig von Ihrem Modell unabhängig von Ihrem Modell ist - in einer Schnittstelle abstrahiert.

Erinnern Sie sich an Ihre Design-Prinzipien: Design auf eine Schnittstelle, keine Implementierung.

Ein weiterer Vorbehalt ist, wie testest du deine Stücke individuell?Wenn ein Modell nicht weiß, wie es bestehen bleibt, kann es anhand dessen, was ein Modell tun sollte, getestet werden soll, und Ihr Persistenz-Mechanismus kann bezogen auf das, was es tun sollte.

In jedem Fall sieht es so aus, als ob Ihre Create-Action-Aktion doppelt doppelt leistet - versuchen Sie, das Modell zu verwenden, um zu speichern, und versucht, die DatenAccess zu verwenden, um weiterhin zu verwenden.Sind diese beiden Objekte dasselbe tun?Könnte dies später verwirrend oder unlesbar / unmackizierbar sein?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top