こちらの投稿で話題にしていた、ASP.NET MVC での話。
要件をおさらいしておくと、文字列で指定されたコントローラ名から、そのコントローラクラスのインスタンスを生成する、ということがお題。
で、前回の投稿ではものすごく泥臭く、すべてのアセンブリと型を列挙して探し回るという実装だった。
しかしながら、
@takepara さんのブログ記事によって、ControllerBuilder ~ ControllerFactory 使えばいいじゃん、ということに気づく。
すなわち、下記のコードで済む。
var context = new HttpContextWrapper(HttpContext.Current);
var routeData = new RouteData();
var requestContext = new RequestContext(context, routeData);
var controller = ControllerBuilder.Current
.GetControllerFactory()
.CreateController(requestContext, "My");
これで MyController クラスのオブジェクトが生成されて返される次第。
コードの流れをおさらいすると、
1. ControllerBuilder クラスのシングルトンインスタンスに問い合わせして、
2. ControllerFactory オブジェクトを取得し、
3. この ControllerFactory オブジェクトに CreateController メソッド呼び出しにて、指定した名前のコントローラオブジェクトを生成して返してもらう、
という流れ。
ファクトリにコントローラを生成してもらう(CreateCOntroller メソッドを呼び出す)際に、生成を求めるコントローラ名に加えて、RequestContext オブジェクトも必要になるのが注意点か。
とはいえ、上記コード例のとおり、ダミーの RequestContext を生成して与えるだけで結構。
@takepara さん、素敵なフィードバックをどうもありがとうございます。