2011-10-12 16 views
6

trang cơ sở của tôi trông giống như:Loại trang cơ sở tùy chỉnh cho chế độ xem dao cạo của tôi, cách sử dụng windsor lâu đài cho thuộc tính autowire?

namespace ASDF.Mvc.ViewEngines.Razor 
{ 
    public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
    { 

     public ISomeHelper SomeHelper { get; set; } 
    } 
} 

quan điểm của tôi/web.config

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="ASDF.Mvc.ViewEngines.Razor.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     </namespaces> 
    </pages> 
    </system.web.webPages.razor> 

Làm thế nào tôi có thể đã này có dây lập như vậy mà SomeHelper sẽ được nối bằng cách sử dụng Castle.

Điều này đang trở lại null vào lúc này, Tôi đã kết nối ISomeHelper và mọi thứ hoạt động tốt cho các bộ điều khiển/kho lưu trữ/dịch vụ của tôi.

Tôi đoán WebViewPage này được gọi ở đâu đó nơi vùng chứa của tôi không có quyền truy cập (như ở cấp bộ điều khiển).

Tôi làm cách nào để hoạt động?

Trả lời

9

Điều đầu tiên về việc tiêm phụ thuộc vào các trang web tùy chỉnh như thế này là bạn không thể sử dụng phép xây dựng. Thật đáng tiếc và tôi hy vọng họ sẽ cải thiện điều này trong các phiên bản sau. Lý do cho điều đó là lớp thực tế thực hiện điều này được tự động phát ra khi chạy bởi công cụ ASP.NET.

Vì vậy, chúng tôi nghiêm túc sử dụng tính năng tiêm tài sản tại thời điểm này.

Vì vậy, một khả năng là sử dụng tùy chỉnh IDependencyResolver. Thật không may IDependencyResolver doesn't play nice with Castle Windsor. Có lẽ đã là một miếng bánh với Ninject chẳng hạn. Tất cả các bạn sẽ phải làm là để trang trí các SomeHelper sở hữu với các thuộc tính [Inject]:

[Inject] 
public ISomeHelper SomeHelper { get; set; } 

và nó sẽ đã được tự động dây bởi Ninject như nó sử dụng một IDependencyResolver tùy chỉnh. Tôi sợ rằng với Windsor bạn sẽ phải làm điều này bằng tay. Vì vậy, bạn có thể đặt vùng chứa của mình ở chế độ Global.asax và sau đó:

public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
{ 
    protected WebViewPage() 
    { 
     SomeHelper = MvcApplication.WindsorContainer.Resolve<ISomeHelper>(); 
    } 

    public ISomeHelper SomeHelper { get; set; } 
} 

Tôi biết điều này thật đáng tiếc nhưng tôi sợ đó là thực tế khắc nghiệt. Hoặc có thể chuyển sang Ninject? Nó chơi thực sự tuyệt vời với ASP.NET MVC 3 và IDependencyResolver của nó.

+0

Cách tính năng tiêm thuộc tính hoạt động trong bộ điều khiển của tôi? – Blankman

+0

chờ đợi, vì vậy tôi phải sau đó tự thiết lập bất kỳ sự phụ thuộc của SomeHelper để sau đó phải không? – Blankman

+1

@Blankman, phụ thuộc tiêm hoạt động trong bộ điều khiển bởi vì bạn đã sử dụng một nhà cung cấp bộ điều khiển tùy chỉnh nhà máy sử dụng windsor để tiêm những phụ thuộc. Theo như câu hỏi thứ hai của bạn về sự phụ thuộc của SomeHelper có liên quan, bạn không cần phải tự thiết lập chúng. Bạn thiết lập những phụ thuộc theo cùng một cách bạn sẽ như thể nó là một phụ thuộc điều khiển. Khi bạn sử dụng '.Giải quyết () 'điều này sẽ tự động cung cấp các phụ thuộc đã đăng ký. –

0

Tôi nghĩ rằng những gì bạn sẽ muốn làm là móc vào Vị trí dịch vụ của MVC3 để kiểm soát cách trang xem được tạo. Tôi chưa sử dụng MVC3, nhưng tôi tìm thấy an article that describes the Service Location feature và có thể cung cấp cho bạn "móc" bạn cần để có thể truy cập WebViewPage trước khi nó được xử lý.

Bằng cách truy cập vào WebViewPage trước khi nó được xử lý, bạn có thể sử dụng Windsor để làm thuộc tính tiêm trang xem của bạn. Theo mặc định, Windsor chỉ thực hiện việc khởi tạo hàm dựng, nhưng bạn có thể tìm thấy một sample of doing property injection via an extension method trên một bài đăng trên blog mà tôi đã thực hiện một vài năm trước trên các ActionFilters MVC1.

+0

mỏ đang làm việc phun tài sản tốt, không chắc chắn những gì tôi đã làm nhưng nó là workign với điều đó. – Blankman

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