2 votes

ASP.NET MVC : Dois-je passer des primitives à mes actions ou dois-je utiliser des Model Binders ?

Je constate que le code que j'écris dans mes contrôleurs est largement répétitif, et surtout que les tests que j'écris pour mes contrôleurs sont également très répétitifs. Le schéma général d'une méthode de sauvegarde est le suivant...

Prenez une entité, et un certain nombre de paramètres primitifs. Ecrire les valeurs des paramètres primitifs sur les mêmes paramètres nommés de mon entité. Valider l'entité. Sauvegarder l'entité si elle est valide.

J'ai déjà un modèle de liaison qui lie tout ce qui hérite de IDataEntity (une interface que toutes nos entités persistantes dans la base de données mettent en œuvre). Ce liant de modèle trouve le référentiel approprié et recherche l'entité avec l'identifiant passé.

J'ai envisagé d'ajouter une extension à ce modèle de classeur qui tirera également les valeurs du fournisseur de valeurs et les écrira par-dessus les valeurs existantes. Cela m'épargnera du code répétitif dans mes actions d'assignation de valeurs à mes entités. Et cela me permettra également de ne passer que des entités à mes tests de contrôleur plutôt qu'un grand nombre de valeurs.

par exemple une méthode qui ressemble actuellement à ceci :

    public ActionResult SaveCompanyAddress(Address address,
        string address1,
        string address2,
        string address3,
        string city,
        string county,
        Country country,
        string postcode)
    {
        address.Address1 = address1;
        address.Address2 = address2;
        address.Address3 = address3;
        address.City = city;
        address.County = county;
        address.Country = country;
        address.Postcode = postcode;

        Validate(address);

        if (ModelState.IsValid)
        {
            using (var tran = TransactionFactory.CreateTransaction())
            {
                addressRepository.Save(entity);
                tran.Commit();
            }

            return this.RedirectToAction(x => x.List(address.Company));
        }
        else
        {
            return View("Edit", address);
        }
    }

Sa longueur serait réduite de moitié et presque tous ses arguments seraient supprimés. Cela semble certainement attrayant car la quantité de code que nous écrivons est réduite, et une validation de test à test peut passer un fournisseur de validation fictif et une adresse par défaut et ne pas s'inquiéter de la définition de tous ces paramètres, mais je crains qu'il y ait un peu trop de magie en coulisse pour que ce soit une bonne idée.

Réflexions ? Opnions ? Des idées ?

2voto

tvanfosson Points 268301

Vous pouvez également faire un compromis et utiliser le liant de modèle par défaut pour lier vos propriétés simples et obtenir les propriétés complexes à partir du fournisseur de valeurs et les remplir "manuellement". Pour un modèle ne comportant que des propriétés simples, le liant de modèle par défaut serait suffisant. Pour les modèles comportant une ou deux propriétés complexes, celles qui ne sont pas gérées par le classeur de modèles par défaut, vous pouvez encore économiser des quantités importantes de code sans avoir à écrire le classeur de modèles personnalisé. Le code de liaison complexe pourrait être écrit en utilisant des méthodes partagées sur une classe. Lorsque le code de liaison de votre contrôleur doit franchir les limites du contrôleur ou devient important, refactorez-le dans votre classe de liaison de modèle personnalisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X