Asp.net mvc 2 MVC源代码单例模式

Asp.net mvc 2 MVC源代码单例模式,asp.net-mvc-2,Asp.net Mvc 2,为什么.net MVC源代码ControllerBuilder使用委托来分配控制器工厂 private Func<IControllerFactory> _factoryThunk; public void SetControllerFactory(IControllerFactory controllerFactory) { _factoryThunk = () => controllerFactory; } \u factoryThunk当前被定义为Func的原

为什么.net MVC源代码ControllerBuilder使用委托来分配控制器工厂

private Func<IControllerFactory> _factoryThunk;

public void SetControllerFactory(IControllerFactory controllerFactory) {
    _factoryThunk = () => controllerFactory;
}

\u factoryThunk
当前被定义为
Func
的原因是它是支持两种重载的通用方法:

void SetControllerFactory(Type);
void SetControllerFactory(IControllerFactory);
第一个的实现使用了
\u factoryThunk
Func
的事实,通过使用
Activator
延迟实例化
类型来声明
Func
内联:

this._factoryThunk = delegate {
    IControllerFactory factory;
    try
    {
        factory = (IControllerFactory) Activator.CreateInstance(controllerFactoryType);
    }
    catch (Exception exception)
    {
        throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.ControllerBuilder_ErrorCreatingControllerFactory, new object[] { controllerFactoryType }), exception);
    }
    return factory;
};
因此,另一个重载看起来具有虚假实现的原因是,由于
\u factoryThunk
被声明为
Func
,因此您建议的行甚至不会编译:

_factoryThunk = controllerFactory;

\u factoryThunk
是一个
Func
controllerFactory
是一个
IControllerFactory
——不兼容的类型。

问题是为什么它们需要延迟实例化?第二种方法可以是_factory=(IControllerFactory)Activator.CreateInstance(controllerFactoryType);我已将问题更新为clearer@JontyMC,你说得很对,我以前错过了那个细微差别。在进一步研究了源代码之后,我认为对设计的解释是允许IControllerFactory的实现者维护它实例化的特定控制器的状态。i、 e.设计结果是控制器实例与其IControllerFactory实例之间的1-1映射。例如,通过这种方式,IControllerFactory的实现可以挂起它在字段中实例化的控制器实例,以供以后使用。(不确定您为什么要这样做)
_factoryThunk = controllerFactory;