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

/Question の呼び出しが「リソースが見つかりません」で終了しないように、コンパイルされたコントローラーを mvc フレームワークに登録するにはどうすればよいですか?

問題はルートテーブルではないと思います。

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 に答える