Asp.net mvc 2 MVC源代码单例模式
为什么.net MVC源代码ControllerBuilder使用委托来分配控制器工厂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的原
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;