2

J'ai une base de données avec les tableaux suivantsMVC3 question héritage

  • entreprises (Contient tous les champs communs)
  • Business_Hotel (Contient des champs spécifiques à Hôtels)
  • Business_Restaraunt (contient des champs spécifiques à Restaraunts)
  • Business_Airport (Contient des champs spécifiques aux aéroports)

je modélise ces EF en utilisant dans héritage.

  • Entreprises (Base)
  • Hôtels (Hérite de Entreprises)
  • Restaraunts (Hérite de Entreprises)
  • Aéroports (Hérite de Entreprises)

J'ai créé le contrôleur avec le contrôleur assistant de création dans VS2010 en utilisant l'entité de base (entreprises)

Je veux réutiliser le même Créer action pour les trois types.

[HttpPost] 
public ActionResult CreateHotel(Business business) 
    { 


     if (ModelState.IsValid) 
     { 


      db.Businesses.AddObject(business);   
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

Si je modifie la fonction comme indiqué ci-dessous, il ne crée correctement une entreprise de type Hôtel

public ActionResult CreateHotel(Hotels business) 

La question est de savoir comment puis-je faire dynamiquement. Y a-t-il une meilleure manière de faire cela?

Répondre

4

En tant que conseil, il devrait être mieux que vous ne cherchez pas à réutilisation une seule Action (même si le principe DRY semble attrayant)

Même si vous pouvez trouver un moyen de le faire, dans le Dans l'avenir, cela serait difficile à maintenir.

Ce que vous essayez de faire est la suivante:

Traiter un Hôtel d'affaires, un restaurant d'affaires, et ces objets comme un aéroport d'affaires. Voyez-vous ce qui ne va pas? Un hôtel devrait avoir ses propres règles d'affaires, de même pour l'aéroport et les restaurants

Si vous essayez à l'avenir d'ajouter une logique spécifique pour chacun d'entre eux, votre méthode d'action augmenterait en complexité (BTW les méthodes d'action devraient seulement appelez le modèle pour les garder propres).

Ceci est décrit mieux dans le livre bleu (DDD)

Donc, mon conseil est de ne jamais réutiliser pas ce genre de logique (logique de domaine), j'essaie personnellement de réutiliser la logique de l'infrastructure ne

+0

Pas toujours, pensez à ce cas. Une action sert de point de contact unique à de nombreux types de clients (silverlight, mvc), maintenant pour les ajouts de fonctionnalités, personne n'est prêt à appeler une nouvelle action, la plupart du temps, la demande est d'utiliser la même action avec plus de paramètres supplémentaires. Dans ce scénario, le modèle de construction s'avère utile, en fait à un coût léger en termes de complexité du code. Mais la séparation des préoccupations est toujours intacte, car la logique du générateur est déplacée du contrôleur. –

1

Quelques façons de l'atteindre. Cependant, le modèle généré automatiquement n'aidera pas.

  1. Tirez parti du motif de conception classique du générateur. Définir un viewmodel, qui peut capturer des données pour les trois modèles, Hôtels, Restaraunts, Aéroports.Dans le modèle de vue, conservez un identificateur comme "BusinessType" etc. et une fonction pour créer l'objet métier approprié en regardant le type. Le distingueur doit être configuré dans l'interface utilisateur de manière statique ou dynamique.

    public class BusinessViewModel 
    { 
    
        // all attributes go here. 
        public int BusinessType { get; set; } 
    
        public Businesses CreateBusinessObject() 
        { 
        if(BusinessType == "1") 
         //Create and return a new Hotel 
        } 
    } 
    

Dans le contrôleur, il sera utilisé comme ceci:

[HttpPost] 
    public ActionResult CreateHotel(BusinessViewModel businessVM) 
    { 


     if (ModelState.IsValid) 
     { 
      Businessess business = businessVM.CreateBusinessObject() 

     db.Businesses.AddObject(business);   
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
     } 

2.Directly prendre forme collection en entrée dans votre méthode d'action dans le contrôleur plutôt que le modèle/viewmodel puis analyser et créer un objet approprié.