一部のコントローラーを手動でインスタンス化する必要があるため、次のコードがあります。
var controller = Activator.CreateInstance(typeof(AccountController),
repository) as AccountController;
AccountController には、次のようなメソッドがあります。
[AllowAnonymous]
[HttpPost]
public ApiJsonResult LogOn(LogOnAccountDto model)
{
ValidateModel(model);
if (ModelState.IsValid)
{
//...
}
}
ModelState.IsValid を機能させたいので、ValidateModel を呼び出してモデルに渡します。
どうやらcontrolContextが設定されていないため、これは失敗します。次のエラーが表示されます。
値を null にすることはできません。パラメーター名: controllerContext 説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.ArgumentNullException: 値を null にすることはできません。パラメータ名: controllerContext
では、「すべて」が機能するように、コードで IController を手動でインスタンス化するにはどうすればよいでしょうか。
前もって感謝します。
では、なぜこれが必要なのですか? 「オンライン戦略ゲーム」のアーキテクチャとゲーム ロジックのアイデアをいじっています。
ゲームの Web バージョンである ASP.NET MVC 4 (プレビュー) アプリケーションがあります。このゲームは、NATIVE アプリを介して Windows Phone や iPhone などのデバイスでもプレイする必要があるという考えです。したがって、ゲーム用の API (http/json を介して通信するある種の REST サービス) が必要です。この API はゲームのパブリック インターフェースになるため、もちろんすべてのゲーム ロジックはこの API の側に配置されます。
そのため、この API を「Web 版」と「モバイル版」の両方のゲームから使用したいと考えています。この API を ASP.NET MVC 4 (プレビュー) 内のエリアとして実装しました。私の最初のことは、実際に「Web バージョン」から API に httpwebrequest を実行することだったので、「モバイル バージョン」とまったく同じように API を使用していました。しかし、APIを「正しい方法」で呼び出すことで得られるjson / web呼び出しのオーバーヘッドをすべて回避するために、実際にはコントローラーを手動でインスタンス化する方がよいのではないかと考えました。
それが私が今ここにいる理由です。コードでコントローラーを手動でインスタンス化したいのです。コントローラーで正確なロジックを使用したいからです。
理にかなっていますか?より良いアイデアがあれば教えてください - 私は実際の製品を生産するのではなく、それを学ぶためにこれを行っています - 少なくともそれは今の目標ではありません - 今私はいくつかの新しいことを学ぼうとしています. :)