Question

Je suis nouveau sur ASP.NET MVC, provenant d'un fond PHP MVC. Cela a été une sorte de transition maladroite (voir mon histoire de questions, heh.)

Une chose que j'aime beaucoup en théorie qui est grande dans le monde .NET, c'est l'idée que les modèles sont de la persistance agnostiques. Mais dans ce cas, quelle est la bonne façon d'enregistrer les modifications d'un modèle? En php, j'appellerais juste $model->save(); Après avoir fait une certaine transformation. En C #, je ne sais pas comment faire cela.

Est-ce approprié?

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

Je suppose que la seule chose qui me frappe comme mal à ce sujet est que, généralement, je ne voudrais pas qu'un contrôleur accéde directement à une couche d'accès aux données de cette manière. Auparavant, dans PHP Land, mes contrôleurs n'accéderaient qu'à des modèles et des vues uniquement.

Était-ce utile?

La solution

Ce que vous faites est bien. ActiveRecord vs Repository vs Home Brew Dal est une question éternelle dont nous discuterons pour toujours.

La modèle de référentiel est très populaire dans le monde .net en ce moment et vous verrez probablement beaucoup d'exemples de son utilisation. MVC ne se soucie pas de votre stratégie d'accès aux données. Utiliser ce que vous trouvez à l'aise est très bien et une meilleure stratégie que d'utiliser un modèle parce que tout le monde le fait.

Autres conseils

Il est normal qu'un modèle ait une fonction SAVE (), mais vous voudriez généralement que ce comportement de sauvegarde () soit indépendant de votre modèle - abstrait à une interface.

N'oubliez pas vos principes de conception: conception d'une interface, pas une implémentation.

Une autre mise en garde est comment testez-vous vos pièces individuellement? Si un modèle ne sait pas comment il est persisté, il peut être testé en fonction de ce qu'un modèle devrait faire, et votre mécanisme de persistance peut être testé en fonction de ce qu'il devrait fais.

Dans tous les cas, il semble que votre action Create () fasse un double service - essayer d'utiliser le modèle pour enregistrer, puis essayer d'utiliser l'accès aux données pour persister. Ces deux objets font-ils la même chose? Cela pourrait-il être déroutant ou illisible / incontrôlable plus tard?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top