2010-10-06 34 views
5

Tôi đang cố gắng để có được Thuộc tính bộ lọc hoạt động trên Thuộc tính bộ lọc hành động tùy chỉnh. Nó đang làm việc như nó được cho là, tuy nhiên, tôi muốn sử dụng DI trên bản thân tài sản. Bộ lọc của tôi trông giống như thế nàyTiêm thuộc tính vào Bộ lọc hành động

[AttributeUsage(AttributeTargets.Class)] 
public sealed class HeaderFilterAttribute : ActionFilterAttribute 
{ 
    public IMarketService MarketService 
    { get; set; } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var view = (ViewResultBase)filterContext.Result; 

     if (view != null) 
     { 
      BaseViewModel viewModel = view.ViewData.Model as BaseViewModel; 
      if (viewModel != null) 
       viewModel.Header = GetHeaderScript(); 
     } 
     base.OnActionExecuted(filterContext); 
    } 

    private string GetHeaderScript() 
    { 
    //Use MarketService here and return header script 
    return "script"; 
    } 
} 

Đây là cách tôi định cấu hình thuộc tính bằng StructureMap bên trong lớp BootStrapper của tôi.

  //HeaderFilterAttribute 
     IMarketRepository marketRepository = new SqlMarketRepository(); 
     IMarketService marketService = new MarketService(marketRepository); 
     ObjectFactory.Container.Configure(r => r.ForConcreteType<HeaderFilterAttribute>(). 
              Configure.WithProperty("MarketService"). 
              EqualTo(marketService)); 

Vấn đề của tôi là tôi không có quyền truy cập vào SqlMarketRepository từ tất cả các loại bê tông của tôi được tiêm qua DI và tôi thực sự không muốn sử dụng các loại bê tông trong bootstrapper của tôi. Vì vậy, câu hỏi cuối cùng hiện nay là, làm thế nào để tôi đưa MarketService vào thuộc tính Filter mà không cần phải sử dụng ở trên? :)

+0

Có phải tùy chọn MVC 3 không? Điều này được xây dựng trong. –

+0

Tôi cần phải đưa ra quyết định trong vòng một tháng Craig và tôi không thực sự chắc chắn nhóm sẽ phê duyệt đi với một phiên bản xem trước để sử dụng sản xuất: ( – Praveen

Trả lời

4

Trong ObjectFactory.Initialize() cuộc gọi của bạn, thêm dòng sau:

SetAllProperties(x => x.OfType<IMarketService>()); 

Đó sẽ bơm instance IMarketService cấu hình vào bất kỳ loại tài sản của IMarketService, trên bất kỳ đối tượng lấy ra từ thùng sơn.

+0

Đó là chính xác những gì tôi cần.) Cảm ơn Josh! – Praveen

1

Tôi nghĩ rằng bạn cần thực hiện tác vụ gọi hành động tùy chỉnh sẽ giải quyết các bộ lọc. Bạn có thể đào một mẫu Windsor ra khỏi công ty của tôi implementation (khoảng 1/2 chiều xuống). Nên có một số trực tuyến có sẵn. Tôi biết tôi đã nhìn thấy một số trên trang web này.

PS. Tôi nhận thấy bạn đang sử dụng mô hình chế độ xem cơ sở để điền tiêu đề. Tôi khuyên bạn nên sử dụng bộ sưu tập ViewData [] với một khóa tĩnh thay vì thừa kế trong mô hình khung nhìn của bạn. :)

+0

Tôi đang cố gắng tránh xa bộ sưu tập ViewData nhiều nhất có thể: D. Bất kỳ lý do tại sao một loại mạnh sẽ là xấu trong trường hợp này? – Praveen

+1

Do bố cục (thông qua ViewData []) cho phép bạn linh hoạt hơn nhiều so với kế thừa các kiểu xem. Hãy tưởng tượng nếu sau này bạn muốn thêm nhiều thành phần hơn (tiêu đề, menu, thanh bên, tiện ích tiểu sử người dùng, v.v.) vào các trang khác nhau. Nếu bạn phải phù hợp với tất cả những gì vào mô hình xem cơ sở của bạn nó sẽ có được đông đúc và bạn có thể thậm chí sẽ không cần tất cả mọi thứ trên mỗi xem. Tôi sử dụng mô hình hoàn toàn cho chế độ xem cụ thể được hiển thị và sau đó đặt các thành phần khác của tôi vào ViewData. Mã xem mẫu: 'var headerModel = ViewData [Constants.HeaderData] dưới dạng HeaderViewModel'. – Ryan

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