Шаблон синглтона исходного кода MVC - PullRequest
5 голосов
/ 04 октября 2010

Почему исходный код .net MVC ControllerBuilder использует делегата для назначения фабрики контроллеров?:

private Func<IControllerFactory> _factoryThunk;

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

Почему он не может просто назначить ControllerFactory напрямую?

1 Ответ

4 голосов
/ 04 октября 2010

Причина, по которой _factoryThunk в настоящее время определяется как Func<IControllerFactory>, заключается в том, что это общее средство для поддержки обеих перегрузок:

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

Реализация первого использует тот факт, что _factoryThunk является Func, объявив, что Func inline, используя Activator для создания экземпляра 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;

_factoryThunk - это Func<IControllerFactory>, тогда как controllerFactory - это IControllerFactory - несовместимые типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...