Domanda

Sono nuovo in ASP.NET MVC, provenendo da un background PHP MVC.È stata una transizione piuttosto imbarazzante (vedi la cronologia delle mie domande, eh.)

Una cosa che mi piace molto in teoria che è grande nel mondo .Net è l'idea che i modelli siano agnostici della persistenza.Ma in questo caso, qual è il modo corretto per salvare le modifiche a un modello?In PHP, chiamerei $model->save(); dopo aver eseguito alcune trasformazioni.In C #, non sono sicuro di come farlo.

È appropriato?

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

Immagino che l'unica cosa che mi sembra sbagliata in questo è che in genere, non vorrei che un controller accedesse direttamente a un livello di accesso ai dati in questo modo.In precedenza, in PHP land, i miei controller accedevano solo a modelli e visualizzazioni, in pratica.

È stato utile?

Soluzione

Cosa stai facendo va bene.ActiveRecord vs Repository vs Home Brew Dal è una domanda eterna che discuteremo per sempre.

the Repository Pattern è molto popolare nel.NET WORLD in questo momento e probabilmente vedrai un sacco di esempi del suo utilizzo.MVC non importa quale sia la tua strategia di accesso ai dati.Usando tutto ciò che trovi a tuo agio è bello e una strategia migliore che usare uno schema perché tutti gli altri lo stanno facendo.

Altri suggerimenti

Va bene che un modello abbia una funzione Save (), ma di solito vorresti che il comportamento Save () fosse indipendente dal tuo modello, astratto via da un'interfaccia.

Ricorda i tuoi principi di progettazione: progetta su un'interfaccia, non su un'implementazione.

Un altro avvertimento è come provi i tuoi pezzi individualmente?Se un modello non sa come è persistente, può essere testato in base a ciò che un modello dovrebbe fare e il tuo meccanismo di persistenza può essere testato in base a ciò che dovrebbe fare.

In ogni caso, sembra che la tua azione Create () stia facendo il doppio dovere: provare a utilizzare il modello per salvare, quindi provare a utilizzare DataAccess per persistere.Questi due oggetti stanno facendo la stessa cosa?Potrebbe essere confuso o illeggibile / non mantenibile in seguito?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top