MVC2 Использование Unity IoC - Как разрешаются контроллеры? - PullRequest
3 голосов
/ 31 августа 2010

У меня есть вопрос относительно того, как настроенный мной контейнер Unity разрешает зависимости контроллера. Я искал объяснение этому, но не нашел ничего действительно ясного по этому вопросу. И, возможно, ответ смотрит мне в глаза ... Взгляните на следующий код, который, я уверен, многие ребята из MVC видели:

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
    IController controller;
    try
    {
        controller = container.Resolve(controllerType) as IController;
    }
    catch (Exception ex)
    {
        throw new InvalidOperationException(string.Format("Error resolving controller {0}", controllerType.Name), ex);
    }
    return controller;
}

Итак, это мое переопределение GetControllerInstance на моей фабрике контроллеров, которую я настроил. Очевидно, типы контроллеров разрешаются из контейнера Unity, но как они в первую очередь регистрируются в контейнере? Как среда MVC знает, как регистрировать типы в контейнере? Я понимаю, что типы разрешаются из этого контейнера, но мне не нравится не знать , как разрешает типы контроллеров.

Ответы [ 2 ]

1 голос
/ 31 августа 2010

За это отвечает DefaultControllerFactory . Вот как это работает:

ASP.NET MVC использует отражение для вывода списка всех типов, которые наследуются от Controller, во всех сборках и их кэширования. Если вы действительно хотите копать дальше, посмотрите на исходный код или используйте рефлектор и проверьте этот метод на типе DefaultControllerFactory:

protected internal virtual Type GetControllerType(
    RequestContext requestContext, string controllerName)

Когда приходит запрос, он использует таблицу маршрутизации, чтобы определить, какой контроллер является текущим, и пытается найти его в списке типов кэшированных контроллеров. Если он находит его, он вызывает метод GetControllerInstance, передавая данный тип, чтобы структура DI могла предоставить экземпляр контроллера, учитывая его тип.

0 голосов
/ 31 августа 2010

MVC не регистрирует типы в Unity.Контейнер Unity проверяет, что вы запрашиваете, чтобы увидеть, может ли он создать его с тем, о чем он знает.

...