Как ввести UrlHelper в MVC с помощью Castle Windsor - PullRequest
6 голосов
/ 02 июня 2010

У меня есть компонент, зависящий от UrlHelper, который мне нужно зарегистрировать с помощью Castle Windsor. UrlHelper, в свою очередь, имеет зависимости в RequestContext (и RouteCollection).

Теперь у моего контроллера есть свойство Url типа UrlHelper, но я не могу получить к нему доступ, насколько я могу сказать.

Как наиболее эффективно зарегистрировать мою зависимость UrlHelper (используя свободную конфигурацию)?

Ответы [ 3 ]

7 голосов
/ 02 июня 2010

Не красиво и не проверено, но должно работать:

container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<UrlHelper>()
    .LifeStyle.PerWebRequest
    .UsingFactoryMethod(() => {
        var context = new HttpContextWrapper(HttpContext.Current);
        var routeData = RouteTable.Routes.GetRouteData(context);
        return new UrlHelper(new RequestContext(context, routeData));
    }));

В будущих версиях Windsor не потребуется FactorySupportFacility для использования UsingFactoryMethod.

В любом случае кажется странным иметь зависимость от UrlHelper ...

3 голосов
/ 03 июня 2010

Я писал об этом (между прочим) несколько дней назад здесь . Это работает с (предстоящим) Виндзор 2.5. До этого предложение Маурисио должно быть самым безопасным.

1 голос
/ 02 июня 2010

Единственный способ найти это - объявить интерфейс IUrlHelper и реализовать класс-оболочку вокруг UrlHelper, который его реализует. Затем мы можем либо внедрить экземпляр класса-оболочки, используя IOC, либо в модульных тестах внедрить фиктивный объект. Это немного больно, но это работает.

...