2010-10-04 82 views
5

爲什麼.NET MVC源代碼ControllerBuilder類使用委託給控制器工廠?:MVC源代碼Singleton模式

private Func<IControllerFactory> _factoryThunk; 

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

爲什麼不能只是直接分配的ControllerFactory ?,即分配:

private IControllerFactory _factory; 

public void SetControllerFactory(IControllerFactory controllerFactory) { 
    _factory = controllerFactory; 
} 

public void SetControllerFactory(Type controllerFactoryType) { 
    _factory = (IControllerFactory)Activator.CreateInstance(controllerFactoryType); 
} 

回答

4

_factoryThunk當前被定義爲一個Func<IControllerFactory>的原因是,它是一個通用的手段來支持重載:

void SetControllerFactory(Type); 
void SetControllerFactory(IControllerFactory); 

第一個實現使用的事實,_factoryThunkFunc通過使用Activator宣佈Func內嵌實例化Type懶洋洋地:

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; 
}; 

因此,有理由對其他重載看起來有一個雜散實現是因爲_factoryThunk被聲明爲Func,你提出行根本不會編譯:

_factoryThunk = controllerFactory; 

_factoryThunkFunc<IControllerFactory>controllerFactoryIControllerFactory - 不兼容的類型。

+0

問題是爲什麼他們需要懶惰的實例?第二種方法可以是_factory =(IControllerFactory)Activator.CreateInstance(controllerFactoryType);我已經更新了這個問題,以便更清楚 – JontyMC 2010-10-05 10:30:41

+0

@JontyMC,你說得對,我錯過了那個細微差別。在詳細瞭解源代碼之後,我相信設計的解釋是允許IControllerFactory的實現者爲其實例化的特定控制器維護狀態。即設計導致Controller的實例與其IControllerFactory的實例之間的1-1映射。這樣,IControllerFactory的實現可以掛在它實例化的字段中的Controller實例上供以後使用。 (不知道爲什麼你會想要雖然) – 2010-10-05 14:51:36