2012-12-31 197 views
3

我想知道這是否可能。我有一個典型的MVC處理法,看起來像這樣的簽名:MVC動作方法的依賴注入

public ActionResult View(MyModel model) 
{ 
    IAnObject myObject = new AnObject(); 
    //several lines of code follow..... 
    return View(model); 
} 

我想擺脫new關鍵字,並注入IAnObject實例進入操作方法。但我不確定MVC是否允許這樣做,在動作方法中將模型注入模型中?有沒有人遇到過這個問題,並且有解決方法嗎? (我們的Io​​C容器是Windsor,萬一有所作爲)

+5

是否有一個原因是你在方法而不是在類級別注入對象? –

+1

同意@JordanKaye。即使ActionResult方法注入是可能的,你從中得到了什麼?如果可能的話,我會事先使用構造函數注入來創建對象或其工廠。 –

+1

@Jordan&Thomas--你提出了很好的觀點。我在這裏考慮過注入方法,因爲這是創建和使用對象的地方。我想讓對象的範圍儘可能接近原來的位置。也就是說,如果construtctor injection是最好的方式去做這件事,我們可以重構。 – larryq

回答

1

如果您希望將此引用作爲參數插入到操作方法中,您可以查看ControllerActionInvoker,它具有an InvokeActionMethod method,我相信這是從InvokeAction調用的。此方法具有傳入其中的參數列表以及操作的說明(ActionDescriptor class)。這個動作描述符有一個GetParameters方法,它會給你更多的detailed information about the parameter,比如你需要依賴注入器的類型信息。我沒有這樣做,所以我不知道它是如何運作的,但似乎是可能的。

我也不知道怎麼說,可能會影響MVC如何選擇一個操作方法張貼到,所以該因素英寸

0

那麼,我同意評論中的人,但是如果您想在方法範圍中使用實例,請嘗試從容器中獲取該實例國際奧委會,是這樣的:

public ActionResult View(MyModel model) 
{ 
    // take from the container of IoC 
    IAnObject myObject = _continerIoC.Resolve<IAnObject >(); 

    //several lines of code follow..... 
    return View(model); 
} 

避免使用new來創建實例,並在容器中的具體類型和解耦依賴條件/引用您的控制器。

我真的考慮使用構造函數/屬性注入。還有一個method injection

+0

鏈接http://msdn.microsoft.com/en-us/library/ff649751.aspx不適用於我。 – Tohid

+0

正在使用IoC容器? –

+0

現在,它的工作原理!奇怪的! – Tohid

1

您可能需要做OnActionExecuting您的注入被稱爲在採取任何行動之前,控制器被執行。這會給你諸如Request的上下文,但可以讓你設置成員變量 - 從而「模擬」構造函數注入。當然,你只需要爲整個控制器做一次。

[NonAction] 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _myService = .........; // get from IoC container 

     base.OnActionExecuting(filterContext); 
    } 
+0

如果這是一個可怕的想法,無論什麼原因,請評論:-) –