私の元の投稿では、ユーザー情報をController
コンストラクターに渡すことを検討していました。Controller
をに依存させたくありませんでしたHttpContext
。テストが困難になるからです。
Mystere Manの解決策に感謝しますが、次の別の解決策が誰かの役に立てば幸いです。私は小さなプロジェクト(約 12 個のコントローラー)を持っているので、それほど悪くはありません。
私は基本的にカスタムControllerFactory
継承を作成しましたDefaultControllerFactory
:
public class MyCustomControllerFactory : DefaultControllerFactory
{
public MyCustomControllerFactory ()
{
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return null;
}
else
{
//Example of User Info - Customer ID
string customerIDStr = requestContext.HttpContext.Session["CustomerID"].ToString();
int customerID = Int32.Parse(customerIDStr);
//Now we create each of the Controllers manually
if (controllerType == typeof(MyFirstController))
{
return new MyFirstController(customerID);
}
else if (controllerType == typeof(MySecondController))
{
return new MySecondController(customerID);
}
//Add/Create Controllers similarly
else //For all normal Controllers i.e. with no Arguments
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
}
}
次にControllerFactory
、Global.asax.cs
Application_Start()
メソッドに を設定します。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory ());
}
PS Ninject のような DI コンテナーの使用を検討しましたが、現在のプロジェクトには複雑すぎると思います。それらを使用することが本当に理にかなっているとき、私は数ヶ月でそれらを見るでしょう.