0

我有一些生成模型和控制器类的代码:

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

生成的控制器代码如下所示:

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

如何将编译后的控制器注册到 mvc 框架中,这样调用 /Question 就不会以“找不到资源”结束

我认为问题不在于路由表。

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

也不行。我认为为此不需要路线注册。我拥有的路线注册非常通用和标准。

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

我记得 MVC 要求 Controller 位于某个目录中 - 在这种情况下它不是。但这真的是一个很奇怪的约定吗?我的意思是 MVC 对目录信息做了什么?我相信它确实会在启动时扫描它并以某种方式注册控制器。那我为什么以后不注册呢?只有 - 怎么?!?

我也不认为问题出在程序集上。

我有这个代码:

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

t 返回编译后的类型。所以我假设它在编译后已经加载。否则 t 将不为人知。我还可以在输出窗口中看到它已加载。

4

2 回答 2

1

一些建议:-

1)尝试自定义控制器工厂(参见例如http://nayyeri.net/custom-controller-factory-in-asp-net-mvc)或者您自己的 IRouteHandler 实现。MVC 2 有许多可以挂钩的扩展点。

2) 看看 MVC 2 源代码。使用对已加载程序集的TypeControllerCache反射来查找控制器。这可能就是它找不到您的类型的原因。

于 2010-08-24T04:41:59.967 回答
0

您可能必须将新程序集加载到 AppDomain 中。

于 2010-08-18T18:28:04.743 回答