Pregunta

Tengo algún código que genera un modelo y una clase de controlador:

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");
}

El código del controlador que se genera se ve así:

//------------------------------------------------------------------------------
// <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>
    {
    }
}

¿Cómo puedo registrar el controlador compilado en el marco MVC, para que la llamada /pregunta no termine con "no se puede encontrar el recurso"

No creo que el problema sea la tabla de ruta.

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

No funciona tan bien. Creo que para esto no se necesita registro de ruta. El registro de ruta que tengo es bastante genérico y estándar.

    routes.MapRoute(
        "Default", // Routenname
        "{controller}/{action}/{id}", // URL mit Parametern
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterstandardwerte
    );

Recuerdo que MVC requiere que el controlador esté en cierto directorio, que en este caso no lo es. Pero es una convención realmente tan extraña. Quiero decir, ¿qué hace MVC con la información del directorio? Lo escanea y registra el controlador de alguna manera en el inicio, creo. Entonces, ¿por qué no debería registrar uno más tarde? Solo, ¿cómo?!?

Además, no creo que el problema sea la asamblea.

Tengo este código:

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

t Devuelve el tipo compilado. Así que supongo que ya está cargado después de la compilación. De lo contrario, no se conocería. También puedo ver en la ventana de salida, que está cargada.

¿Fue útil?

Solución

Algunas sugerencias:-

1) Pruebe una fábrica de controladores personalizados (ver EG http://nayyeri.net/custom-controller-factory-in-asp-net-mvc) o tal vez su propia implementación de IrouteHandler. MVC 2 tiene muchos puntos de extensibilidad en los que podría conectarse.

2) Eche un vistazo a las fuentes MVC 2. los TypeControllerCache encuentra controladores que usan reflexión sobre el cargado Ensambles. Probablemente por eso no encuentra tu tipo.

Otros consejos

Probablemente tendría que cargar su nuevo ensamblaje en el Appdomain.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top