107 votes

ASP.net mvc mettre des contrôleurs dans un projet séparé

Je suis en train d'apprendre asp.net mvc et j'essaie de comprendre comment déplacer mon contrôleurs dans un projet distinct. En général, lorsque j'ai conçu asp.net web apps avant, j'ai créé un projet pour mes modèles, un autre pour ma logique, et puis il y a le web.

Maintenant que je suis en apprentissage asp.net mvc j'espérais suivent un schéma similaire et placez les modèles et les contrôleurs, chacun dans leurs propres projets, et il suffit de laisser le views/scripts/css dans le web. Les modèles, c'était facile, mais ce que je ne comprends pas, c'est comment faire pour que mon contrôleurs dans un projet distinct, être "trouvé". Aussi, je voudrais savoir si c'est conseillé. Merci!

91voto

Craig Stuntz Points 95965

Tout d'abord, il est certainement une bonne idée de mettre votre modèle dans un projet distinct. Comme vous l'avez découvert, ce qui est insignifiant.

Concernant les Contrôleurs et les Vues, je ne vois pas d'avantage évident pour les séparer, pour la plupart des projets de base, même si vous avez un besoin particulier de le faire dans une application particulière.

Si vous choisissez de le faire, alors vous aurez besoin de dire le cadre, comment trouver vos contrôleurs. La façon la plus simple de le faire est de fournir votre propre ControllerFactory. Vous pouvez prendre un coup d'oeil au code source pour le DefaultControllerFactory pour avoir une idée de comment c'est fait. Sous-typage de cette classe et en remplaçant la GetControllerType(string controllerName) méthode peut être suffisant pour accomplir ce que vous demandez.

Une fois que vous avez créé votre propre personnalisé ControllerFactory, vous ajoutez la ligne suivante à Application_Start mondiale.asax à dire le cadre où le trouver:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

Mise à jour: Lire ce post et les affiche des liens pour plus d'info. Voir aussi Phil Haack commentaire de ce post, à propos de:

ControllerBuilder.Current.DefaultNamespaces.Add(
    "ExternalAssembly.Controllers");

...ce qui n'est pas une solution complète, mais peut-être assez bon pour les cas simples.

20voto

ThisGuy Points 536

Alors qu'il est raisonnable de créer votre propre ControllerFactory, je l'ai trouvé plus commode de définir tous mes Contrôleurs de chaque projet, mais dérivent de Contrôleurs dans mon projet Partagé:

namespace MyProject1.Controllers
{
   public class MyController : MySharedProject.Controllers.MyController
   {
      // nothing much to do here...
   }
}

namespace MySharedProject.Controllers
{
   public abstract class MyController : System.Web.Mvc.Controller
   {
      // all (or most) of my controller logic here...
   }
}

Ceci a l'avantage supplémentaire que vous avez un endroit pour mettre votre Contrôleur logique qui diffère d'un projet à l'autre. Aussi, il est plus facile pour les autres développeurs à trouver rapidement votre Contrôleur de logique, car les Contrôleurs existent pas dans la norme.

Quant à savoir si cela est souhaitable, je pense que c'est absolument. J'ai créé un Compte commun de Gestion de la logique que je veux partager entre les projets qui n'ont que très différente de la logique métier. Donc, je suis le partage de mon Compte Admin et les Contrôleurs, mais les autres Contrôleurs sont spécifiques à leurs projets respectifs.

1voto

Jamie Points 101

La forme la plus simple de la séparation que j'utilise est de conserver les Vues "comme est" dans le projet MVC mais supprimer les Contrôleurs. Puis dans un nouveau ClassLibrary projet d'ajouter les classes de Contrôleur et de s'assurer qu'ils héritent de Contrôleur.

Le MVC moteur de routage route automatiquement pour les Contrôleurs dans le ClassLibrary et les Contrôleurs de construire automatiquement les points de Vue à partir de l'original projet MVC, à condition d'avoir de vos références et de l'usage correctement en place.

Je suis à l'aide de cette architecture à mettre en œuvre un Html module de Rapports qui peuvent être compilés et utilisés séparément à partir de la solution principale. Enfin, je suis libre à partir du SSRS!

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