MVC DefaultControllerFactory代码分析
|
如果我们需要继承DefaultControllerFactory,下面的几个方法可以被重载
图1 Overridable Methods on DefaultControllerFactory 列表中有两个创建IController实例的方法:CreateController和GetControllerInstance,他们之间有什么关系呢,首先让我们来看DefaultControllerFactory的类声明 public class DefaultControllerFactory : IControllerFactory
可见DefaultControllerFactory实现了IControllerFactory接口,那么这个接口又有哪些内容呢 public interface IControllerFactory
{
IController CreateController(RequestContext requestContext, string controllerName);
void ReleaseController(IController controller);
}
IControllerFactory接口只有两个方法,由此可见DefaultControllerFactory的两个创建IController的方法中,CreateController是工厂接口的具体实现,供MVC框架调用,而GetControllerInstance是DefaultControllerFactory类内部提供的创建IController实例的方法,至此,我们知道了他们的区别,可是,这些方法是孤立的吗,CreateController、GetControllerInstance和GetControllerType三个方法是怎么调用顺序,最终使MVC框架能够获得IController实例呢,解答这两个问题我们需要深入CreateController方法内部: public virtual IController CreateController(RequestContext requestContext, string controllerName)
{
if (requestContext == null)
{
throw new ArgumentNullException("requestContext");
}
if (string.IsNullOrEmpty(controllerName))
{
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controllerName");
}
Type controllerType = this.GetControllerType(requestContext, controllerName);
return this.GetControllerInstance(requestContext, controllerType);
}
在方法内部,我们看到,当MVC框架调用CreateController时,其方法首先通过GetControllerType获得了IController实例的类型,然后把该类型传给了GetControllerInstance方法 protected internal virtual IController GetControllerInstance
(RequestContext requestContext, Type controllerType)
{
IController controller;
//略去非关键代码...
try
{
controller = (IController) Activator.CreateInstance(controllerType);
}
catch (Exception exception)
{
//略去非关键代码...
}
return controller;
}
从源码上看,GetControllerInstance方法主要功能就是通过Activator创建实例,CreateController方法最终将GetControllerInstance创建的IController实例返回给了MVC框架。 上述调用过程,实际上就是图1所述的方法默认行为,但我认为不够清晰,补充后应该是
|

浙公网安备 33010602011771号