2010-03-16 10 views
2

J'ai ajouté un répertoire App_Code à mon projet ASP.NET MVC afin d'obtenir une compilation dynamique pour les plugins. Seul un léger désagrément est que lors du développement de nouveaux plugins, je ne reçois pas intellisense sur les classes du répertoire App_Code.ASP.NET MVC utilisant le répertoire App_Code

Actuellement, je les crée dans un autre répertoire de mon projet, puis je les copie dans App_Code.

est-il possible de contourner ce problème?

[Mise à jour]

J'ai posté une "réponse" ci-dessous. Techniquement, cela répond à la question en fonction de ma propre spécification, l'utilisation d'outils (par exemple intellisense) ne devrait pas être nécessaire pour créer des plugins. Cependant, cela a posé une question sur la façon dont je peux obtenir un framework de plugin compilé dynamiquement sans utiliser App_Code. Puisque cette question est si différente de l'original, je la soulèverai séparément.

+1

Quelle est votre IDE? –

+0

VS 2008/2010 RTM –

Répondre

0

Il semble peu probable que je puisse référencer du code dans mon assemblage d'application Web MVC à partir de App_Code au moment du design. Je crois que c'est juste la nature des projets d'application Web dans Visual Studio et le fait que le code dans le répertoire App_Code est compilé dans un assembly différent.

Dans ma question initiale, j'ai expliqué que je voulais utiliser App_Code en raison de ses capacités de compilation dynamique. En pensant à mes exigences d'extensibilité, le fait qu'intellisense ne fonctionne pas ne devrait pas être un problème, car un IDE est et non requis pour développer des plugins - si j'allais ouvrir Visual Studio pour les développer peut également utiliser des bibliothèques de classes.

penser donc de mon architecture plug-in, je suis très bien avec la notion de définir mes plugins (http://weblogs.asp.net/justin_rogers/articles/61042.aspx) et je peux faire le chargement automatique des plug-ins dans un répertoire spécifique comme ceci:

  var assemblies = new List<Assembly>(); 
     var di = new System.IO.DirectoryInfo(Server.MapPath("~/Plugins")); 

     di.GetFiles("*.dll").ToList().ForEach(x => { 
      assemblies.Add(Assembly.LoadFrom(x.FullName)); 
     }); 

     List<Plugin> ExternalPlugins = 
      Plugin.InitializePlugins(assemblies).ToList(); 

La seule raison pour ne pas utiliser/bin était performance. Cependant, puisque le projet plugin référencé le projet web principal, j'ai fini par avoir à utiliser des événements de post-construction pour tout garder en échec - ce que je n'ai pas aimé. Donc, une meilleure solution (comme suggéré par un certain nombre de personnes) est d'utiliser un fichier de configuration pour définir les plugins et déposer les dll dans la corbeille comme d'habitude.

Mais avec toutes ces différentes approches, je contourne l'exigence initiale - pour être en mesure de modifier les plugins à la volée sans utiliser d'IDE et sans avoir à compiler manuellement l'application.

Donc dans ce cas, utilise App_Code vraiment si mauvais et il reviendra me mordre? ...

2

ASP.NET MVC utilise un web application project in contrast to a web site. Un projet d'application Web doit être compilé. Le répertoire App_Code n'a aucun sens dans un tel type d'application.

+0

@Darin, je comprends la différence entre les types de projets, c'est cependant une chose VS, pas une chose d'exécution. La raison de l'utilisation du répertoire App_Code est que je veux que les gens puissent facilement ajouter des plugins, sans devoir ouvrir l'application dans VS/VWDE, ajouter le plugin et recompiler. Il offre également l'avantage que les gens peuvent écrire des plugins dans leur langue préférée, que ce soit C#, vb.net ou ruby. L'utilisation de App_Code est-elle si mauvaise? C'est ainsi que fonctionnent les applications comme BlogEngine et c'est génial du point de vue de l'extensibilité. –

+0

J'ai ajouté un downvote, parce que j'ai utilisé le répertoire App_Code dans une application web MVC. La raison pour laquelle j'en avais besoin était de remplacer le VirtualPathProvider lors du déploiement sur IIS6. Je n'ai pas pu retrouver la documentation originale, mais ce post contient quelques infos: http: //sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/ – Bertvan

0

Il y a une réponse. Pour MVC3 au moins. N'ouvrez pas la solution en tant que solution. Ouvrez-le en tant que site Web à partir d'IIS local (en supposant que c'est comme cela que vous l'exécutez). Ensuite, vous verrez votre code app_code dynamique apparaître avec intellisense. Mais vous ne serez pas en mesure de naviguer vers d'autres bibliothèques de code qui sont à l'extérieur. Vous aurez besoin d'une autre instance de studio et d'ouverture comme solution pour le faire.

Questions connexes