2010-10-06 103 views
5

我正在嘗試使屬性注入工作在自定義動作篩選器屬性上。它正在按照它應有的工作,但是,我想在屬性本身上使用DI。我的過濾器看起來像這樣將屬性注入到動作篩選器

[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"; 
    } 
} 

這就是我在我的BootStrapper類中使用StructureMap配置屬性的方法。

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

我的問題是我沒有SqlMarketRepository訪問,因爲我所有的具體類型是通過DI注入,我真的不希望在我的引導程序使用的具體類型。所以現在最終的問題是,如何將MarketService注入到Filter屬性中而不訴諸於上述? :)

+0

是MVC 3的一個選項?這是內置的。 – 2010-10-06 20:49:54

+0

我需要在一個月內作出決定Craig,我不確定團隊會批准使用預覽版進行生產使用:( – Praveen 2010-10-06 21:12:14

回答

4

在你ObjectFactory.Initialize()調用中,添加下列行:

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

這將注入配置IMarketService實例成型IMarketService的任何屬性,從容器中檢索任何對象上。

+0

這正是我所需要的,這簡直太棒了: )謝謝喬希! – Praveen 2010-10-07 02:17:08

1

我想你需要一個自定義動作調用器實現來解析過濾器。你可以從我公司的implementation(大約下降1/2)挖一個溫莎樣本。應該有更多的在線可用。我知道我在這個網站上看到過一些。

PS。我注意到您正在使用基本視圖模型來填充標題。我建議在視圖模型中使用ViewData []集合而不是繼承。 :)

+0

我想盡可能遠離ViewData集合:D。在這種情況下,強類型會有什麼不好? – Praveen 2010-10-07 02:18:27

+1

因爲組合(通過ViewData [])比視圖模型的繼承允許更多的靈活性。想象一下,如果你以後想要添加更多的組件(標題,菜單,側邊欄,用戶配置文件部件等)到各種頁面。如果你必須將所有這些融合到你的基本視圖模型中,它將會變得擁擠,你甚至可能甚至不需要每個視圖上的所有東西。我純粹使用模型來渲染特定視圖,然後將其他組件放入ViewData中。示例視圖代碼:'var headerModel = ViewData [Constants.HeaderData]作爲HeaderViewModel'。 – Ryan 2010-10-07 14:44:08