ตัวควบคุมถูกสร้างขึ้นสำหรับทุกคำขอโดยControllerFactory
(ซึ่งโดยค่าเริ่มต้นคือDefaultControllerFactory
)
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
โปรดทราบว่าตัวHtml.Action
ช่วย Html จะสร้างตัวควบคุมอื่น
เวอร์ชันสั้น ๆControllerActivator.Create
เรียกว่า (สำหรับทุกคำขอ) เพื่อสร้างคอนโทรลเลอร์ (ซึ่งจะติดตั้งคอนโทรลเลอร์ใหม่ผ่าน DependencyResolver หรือผ่านทาง Activator หากไม่มีการตั้งค่า Resolver):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
รุ่นที่ยาวกว่าคือ (นี่คือรหัสจากแหล่งที่มาจาก MvcHandler):
protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
SecurityUtil.ProcessInApplicationTrust(() =>
{
IController controller;
IControllerFactory factory;
ProcessRequestInit(httpContext, out controller, out factory);
try
{
controller.Execute(RequestContext);
}
finally
{
factory.ReleaseController(controller);
}
});
}
private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
// non-relevant code
// Instantiate the controller and call Execute
factory = ControllerBuilder.GetControllerFactory();
controller = factory.CreateController(RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.ControllerBuilder_FactoryReturnedNull,
factory.GetType(),
controllerName));
}
}
นี่คือรหัสโรงงานของ Controller:
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
ซึ่งโดยทั่วไปเรียกสิ่งนี้ว่า:
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
ซึ่งเรียกเมธอดนี้ในControllerActivator
(รหัสนี้พยายามถาม DependencyResolver สำหรับอินสแตนซ์หรือเพียงแค่ใช้คลาส Activator):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
สิ่งนี้อาจอยู่ภายใต้ข้อมูลที่มากเกินไป ... แต่ฉันต้องการแสดงให้เห็นว่าคุณได้รับคอนโทรลเลอร์ใหม่สำหรับทุกคำขอจริงๆ