2010-06-02 33 views
6

Tôi có một thành phần có phụ thuộc vào UrlHelper mà tôi cần phải đăng ký sử dụng Castle Windsor. UrlHelper lần lượt có depdendencies trên RequestContext (và RouteCollection).Làm thế nào để tiêm UrlHelper trong MVC sử dụng Castle Windsor

Hiện tại, bộ điều khiển của tôi có thuộc tính Url thuộc loại UrlHelper nhưng không thể truy cập thực sự điều này theo như tôi có thể biết.

Cách hiệu quả nhất để đăng ký phụ thuộc UrlHelper của tôi (sử dụng cấu hình thông thạo) là gì?

Trả lời

7

Không xinh đẹp và không được kiểm tra nhưng nó phải làm việc:

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

phiên bản tương lai của Windsor sẽ không cần phải sử dụng FactorySupportFacility UsingFactoryMethod.

Dù sao nó có vẻ khá kỳ lạ để có một sự phụ thuộc vào UrlHelper ...

+0

Cảm ơn, đó là điều mà tôi đã kết thúc. Tôi đang sử dụng UrlHelper trong lớp OutputCacheHelper để xóa các trang khỏi bộ nhớ cache bằng cách sử dụng ví dụ: _response.RemoveOutputCacheItem (_urlHelper.RouteUrl ("Home")); Điều này được sử dụng bởi nhiều bộ điều khiển, do đó, nó có vẻ có ý nghĩa để cấu trúc lại nó thành một lớp riêng biệt có phụ thuộc vào HttpRequestBase và UrlHelper. Điều này có tệ không? –

+1

@Mauricio Scheffer: Tại sao nó có vẻ lạ? Bạn phải tạo URL trong các dịch vụ như thế nào? Giả sử bạn cần phải gắn một URL vào một e-mail trong một dịch vụ gửi e-mail? Bạn làm điều đó như thế nào? – mattalxndr

1

Cách duy nhất tôi tìm thấy để thực hiện việc này là khai báo giao diện IUrlHelper và triển khai lớp bao bọc xung quanh UrlHelper triển khai thực hiện. Sau đó, chúng ta có thể tiêm một thể hiện của lớp trình bao bọc bằng cách sử dụng IOC, hoặc trong các phép thử đơn vị tiêm một đối tượng giả. Đó là một chút đau đớn, nhưng nó hoạt động.

3

Tôi viết blog về nó (trong số những thứ khác) vài ngày trước here. Nó hoạt động với (sắp tới) Windsor 2.5. Cho đến đó, đề nghị của Mauricio sẽ là đặt cược an toàn nhất của bạn.

Các vấn đề liên quan