如果我们需要继承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所述的方法默认行为,但我认为不够清晰,补充后应该是
|