在我原来的帖子中,我正在研究将用户信息传递给Controller
构造函数。我不想Controller
依赖HttpContext
,因为这会使测试变得困难。
虽然我感谢Mystere Man的解决方案,但我希望以下替代解决方案对某人有所帮助。我有一个小项目(大约十几个控制器),所以还不错。
我基本上创建了我的自定义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 容器,但我认为它们对于我当前的项目来说太复杂了。几个月后,当使用它们真的很有意义时,我会看看它们。