2010-06-02 56 views
6

我有一個組件對UrlHelper具有依賴性,我需要使用Castle Windsor進行註冊。 UrlHelper依次對RequestContext(和RouteCollection)進行depdendencies。如何使用Castle Windsor在MVC中注入UrlHelper

現在我的控制器有一個類型爲UrlHelper的Url屬性,但根據我的情況我無法真正訪問它。

什麼是最有效的方式來註冊我的UrlHelper依賴(使用流暢的配置)?

回答

7

不漂亮,而不是測試,但它應該工作:

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

溫莎的未來版本將不需要FactorySupportFacility使用UsingFactoryMethod。

反正它似乎很奇怪,有一個依賴於UrlHelper ...

+0

謝謝,這幾乎是我結束了。 我在OutputCacheHelper類中使用UrlHelper,該類可以使用例如下列命令從緩存中刪除頁面:_response.RemoveOutputCacheItem(_urlHelper.RouteUrl(「Home」)); 這是由多個控制器使用,所以它似乎有意義將它重構成一個單獨的類,它依賴於HttpRequestBase和UrlHelper。這不好嗎? – 2010-06-03 08:25:40

+1

@Mauricio Scheffer:爲什麼看起來很奇怪?你應該如何在服務中生成URL?假設您需要在電子郵件發送服務中將URL粘貼到電子郵件中?你會怎麼做? – mattalxndr 2013-09-25 23:20:10

1

我發現要做到這一點的唯一方法是聲明一個IUrlHelper接口,並實現一個實現它的包裝類UrlHelper。然後,我們可以使用IOC注入包裝類的實例,或者在單元測試中注入模擬對象。這有點痛苦,但它有效。

3

我的博客上講述它(除其他事項外)前幾天here。它適用於(即將到來的)溫莎2.5。在此之前,Mauricio的建議應該是你最安全的選擇。

相關問題