2010-08-18 4 views
0

J'ai un code qui génère un modèle et une classe de contrôleur:Comment enregistrer un contrôleur généré dans le framework MVC?

public ActionResult Generate() 
{ 

    ModelGenerator model = new ModelGenerator("c:/Upload/SampleModel.cs", "CodeDOMSample"); 
    model.addProperties(); 
    model.addConstructor(); 
    model.GenerateCSharpCode(model._outputFileName); 
    Type t = Generator.CompileDOM(model.targetUnit, "c:/Upload/ModelCode.dll", model.assemblies()); 

    ControllerGenerator controller = new ControllerGenerator("c:/Upload/SampleController.cs", "CodeDOMSample",t); 
    controller.GenerateCSharpCode(controller._outputFileName); 
    Generator.CompileDOM(controller.targetUnit, "c:/Upload/ControllerCode.dll", controller.assemblies()); 

    // Somehow register compiled Controller to MVC 

    return RedirectToAction("About"); 
} 

Le code du contrôleur qui est généré ressemble à ceci:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  Dieser Code wurde von einem Tool generiert. 
//  Laufzeitversion:4.0.30319.1 
// 
//  Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 
//  der Code erneut generiert wird. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace CodeDOMSample 
{ 
    using System; 
    using System.Web; 
    using System.Web.MVC; 


    // Copyright (c) AdaPro GmbH. All rights reserved. 
    public sealed class QuestionController : PlatformController<CodeDOMSample.Question> 
    { 
    } 
} 

Comment puis-je enregistrer le contrôleur compilé dans le cadre mvc , de sorte que l'appel/question ne se termine pas avec "ressource introuvable"

Je ne pense pas que le problème soit la table de routage.

return RedirectToAction("Index", t.Name); 

Ne fonctionne pas aussi bien. Je pense que pour cela, aucun enregistrement de route n'est nécessaire. L'enregistrement d'itinéraire que j'ai est assez générique et standard. Je me souviens que MVC exige que le contrôleur soit dans un certain répertoire - ce qui n'est pas le cas dans ce cas. Mais est-ce vraiment une convention si étrange? Je veux dire ce que fait MVC avec les informations de répertoire? Il le scanne et enregistre le contrôleur en quelque sorte au démarrage je crois. Alors pourquoi ne devrais-je pas en enregistrer un plus tard? Seulement - comment?!?

Aussi je ne pense pas que le problème est l'assemblage.

Je possède ce code:

// Invoke compilation. 
CompilerResults cr = provider.CompileAssemblyFromDom(cp, cu); 
Type t = cr.CompiledAssembly.GetExportedTypes().First(); 
return t; 

t renvoie le type compilé. Donc, je suppose qu'il est déjà chargé après la compilation. Sinon, je ne serais pas connu. Aussi, je peux voir dans la fenêtre de sortie, qu'il est chargé.

+0

Avez-vous essayé d'enregistrer un itinéraire de la manière habituelle, comme dans 'Global.asax.cs'? – bzlm

+0

Voir la question pour la réponse. (J'ai mis à jour la question) –

Répondre

1

Quelques suggestions: -

1) Essayez un contrôleur personnalisée en usine (Voir par exemple http://nayyeri.net/custom-controller-factory-in-asp-net-mvc) ou peut-être votre propre implémentation de IRouteHandler. MVC 2 a de nombreux points d'extensibilité que vous pourriez accrocher.

2) Jetez un oeil aux sources MVC 2. Le TypeControllerCache trouve des contrôleurs utilisant la réflexion sur les assemblés chargés. C'est probablement pourquoi il ne trouve pas votre type.

+0

Custom Controller Factory est la solution. –

0

Vous devrez probablement charger votre nouvel assembly dans AppDomain.

+0

J'ai ce code: // Invoke compilation. CompilerResults cr = provider.CompileAssemblyFromDom (cp, cu); Type t = cr.CompiledAssembly.GetExportedTypes(). First(); return t; t renvoie le type compilé. Donc je suppose qu'il est déjà chargé après la compilation. Sinon, je ne serais pas connu. –

Questions connexes