Bộ điều khiển được tạo cho mọi yêu cầu bởi ControllerFactory
(theo mặc định là DefaultControllerFactory
).
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Lưu ý rằng Html.Action
Trình trợ giúp Html sẽ tạo một bộ điều khiển khác.
Phiên bản ngắn ControllerActivator.Create
được gọi (cho mọi yêu cầu) để tạo Bộ điều khiển (tạo Bộ điều khiển mới thông qua DependencyResolver hoặc thông qua Trình kích hoạt nếu chưa thiết lập Bộ phân giải):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Đây là phiên bản dài hơn (Đây là mã từ nguồn từ 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));
}
}
Đây là mã xuất xưởng của Bộ điều khiển:
public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = GetControllerType(requestContext, controllerName);
IController controller = GetControllerInstance(requestContext, controllerType);
return controller;
}
Về cơ bản gọi đây là:
protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ControllerActivator.Create(requestContext, controllerType);
}
Phương thức nào gọi phương thức này trong ControllerActivator
(Mã này cố gắng hỏi DependencyResolver cho một phiên bản hoặc chỉ sử dụng lớp Activator):
public IController Create(RequestContext requestContext, Type controllerType)
{
try
{
return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
}
Điều này có thể thuộc về quá nhiều thông tin ... Nhưng tôi muốn chứng minh rằng bạn thực sự CÓ THỂ nhận được một bộ điều khiển mới cho MỌI yêu cầu.