2015-09-08 8 views
2

Я пытаюсь понять пример кода от an article о впрыске зависимостей.Зависимость впрыска - контроллер завод

В принципе, есть фабрика контроллеров со словарем. Ключами являются строки, значения - это функции, принимающие RequestContext и возвращающие IController объект.

public class MyControllerFactory:DefaultControllerFactory 
{ 
    private Dictionary<string, Func<RequestContext, IController>> controllers; 

    public MyControllerFactory(ICustomerRepository repository) 
    { 
    controllers = new Dictionary<string, Func<RequestContext, IController>>(); 
    controllers["Home"] = controller => new HomeController(repository); 
    } 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
    if(controllers.ContainsKey(controllerName)) 
    { 
     return controllers[controllerName](requestContext); 
    } 
    else 
    { 
     return null; 
    } 
    } 
} 

В строке ниже, AFAIK, добавляет функцию, определенную с лямбда-выражения (он принимает controller в качестве аргумента и возвращает new HomeController(repository)).

controllers["Home"] = controller => new HomeController(repository); 

Теперь, какой смысл требовать аргумент RequestContext (названный controller выше), если функция ничего не делает с ней, потому что она просто возвращает new HomeController(repository)? Какова цель передачи любого аргумента функции, которая возвращает новый объект, не используя этот аргумент? Или, может, и так, но я не вижу этого.

ответ

0

Вы правы. Домашний контроллер здесь не использует переданные в параметрах RequestContext (смутно названный «контроллер»). Причина это есть, потому что словарь определяется как

private Dictionary<string, Func<RequestContext, IController>> controllers; 

Func<RequestContext, IController> это функция, которая должна возвращать контроллер. Заводская функция Home Controller не нуждается в контексте запроса; это всего лишь одна строка, вызывающая new HomeController(repository), но вполне возможно, что для более сложного контроллера нужен RequestContext для создания.

Я должен добавить, что этот учебник, кажется, не самый хорошо написанный. Я бы не добавил требование для контекста запроса в словаре, если он не используется.

0

Функция должна принимать параметр, чтобы соответствовать подписи Func<RequestContext, IController>. Лямбда controller => new HomeController(repository) в конечном счете эквивалентна следующий метод:

IController function(RequestContext context) 
{ 
    return new HomeController(repository); 
} 

Мы можем видеть, что это совпадает с подписью Func<RequestContext, IController>: (принимая некоторые вольности, компилятор фактически не генерировать это)

delegate IController Function(RequestContext context); 

Любая функция, которая используется как элемент в словаре, должна соответствовать этой сигнатуре.

Другими словами, лямбда, принимающая один параметр, является в данном случае Func<RequestContext, IController>, что принципиально не то же самое, что без параметра без лямбда, которое было бы Func<IController>.

Смежные вопросы